参考:https://www.cnblogs.com/nyhhd/p/12684177.html

session存在服务端,session监听器可以用来跟踪session的生命周期。spring-boot项目越来越流行,我就记录下spring boot项目中使用session监听器的过程,以便以后参考。

spring boot使用监听器非常方便,使用这2个注解就可自动加载注册了:@WebListener和@ServletComponentScan

首先在springboot启动类SpringBootApplication 上使用@ServletComponentScan注解。然后使用@WebListener声明监听器。
SpringBootApplication 上使用@ServletComponentScan 注解后
Servlet可以直接通过@WebServlet注解自动注册
Filter可以直接通过@WebFilter注解自动注册
Listener可以直接通过@WebListener 注解自动注册

在启动类上使用@ServletComponentScan,就可以自动扫描使用@WebServlet、@WebFilter和@WebListener注解的类完成自动注册。

1.编写session监听器类实现HttpSessionListener接口,并加上@WebListener注解,声明此类是一个监听器。

@WebListener
public class OpOnlineUserSessionListener  implements HttpSessionListener {/*** session被销毁时触发,如下情况*      1.主动调用session.invalidate()*         2.session超时*/@Overridepublic void sessionDestroyed(HttpSessionEvent event) {HttpSession session = event.getSession();//获取当前用户信息Params params  = (Params)session.getAttribute("userName");//移除在线用户if(params!= null && StringUtils.isNotEmpty(params.getUsername())){LoginOperateInfo loginInfo = new LoginOperateInfo();//为0代表不是登录状态loginInfo.setIsLogin(LoginStatusEnum.OFF_LINE.getCode());loginInfo.setSessionId(session.getId());//为2代表操作类型为登出loginInfo.setOperateType(LoginStatusEnum.LOGIN_OUT.getCode());loginInfo.setUserId(params.getUserId());loginInfo.setUserNo(params.getUsername());loginInfo.setUserName(params.getUserNameCN());int count = updateIsLogin(session.getId());if(count>0){insertLoginOperateInfo(loginInfo);}}}//session被创建时触发@Overridepublic void sessionCreated(HttpSessionEvent event) {/*HttpSession session = event.getSession();Params params1  = (Params)session.getServletContext().getAttribute("userName");//获取当前用户信息Params params  = (Params)session.getAttribute("userName");//添加在线登录记录if(params!= null && StringUtils.isNotEmpty(params.getUsername())){LoginOperateInfo loginInfo = new LoginOperateInfo();//为1代表是登录状态loginInfo.setIsLogin(1);loginInfo.setSessionId(session.getId());//为1代表操作类型为登陆loginInfo.setOperateType(1);loginInfo.setUserId(params.getUserId());loginInfo.setUserNo(params.getUsername());loginInfo.setUserName(params.getUserNameCN());insertLoginOperateInfo(loginInfo);}*/}/*** 登录登出操作记录表* @param loginInfo*/private void insertLoginOperateInfo(LoginOperateInfo loginInfo){loginInfo.setOperateTime(new Date());loginInfo.setCreateTime(new Date());ICASUserDao userDao = SpringContextUtil.getBean(ICASUserDao.class);userDao.insertLoginOperate(loginInfo);}/*** 根据sessionId更新用户登录状态* @param sessionId*/private int updateIsLogin(String sessionId){ICASUserDao userDao = SpringContextUtil.getBean(ICASUserDao.class);return userDao.updateIsLogin(sessionId);}}

2.启动类上使用@ServletComponentScan,自动扫描带有(@WebServlet, @WebFilter, and @WebListener)注解的类,完成注册。

package com;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.boot.web.servlet.ServletComponentScan;@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})//无数据库运行
@ServletComponentScan //scans from the package of the annotated class (@WebServlet, @WebFilter, and @WebListener)
public class WebApp{public static void main(String[] args) {System.out.println(" springApplication run !");SpringApplication.run(WebApp.class,args);}}

只用简单的2个注解就完成了session监听器的注册。这样就能监听到容器session的生命周期了。

注意:HttpServletRequest的getSession()方法,如果当前请求没有对应的session会自动创建session。

使用getSession(false)就不会创建session,如果没有当前请求对应的session就返回null.

Spring Boot 之 session监听器相关推荐

  1. spring boot 分布式session实现

    spring boot 分布式session实现 主要是通过包装 HttpServletRequest 将 session 相关的方法进行代理. 具体是的实现就是通过 SessionRepositor ...

  2. (21)Spring Boot过滤器、监听器【从零开始学Spring Boot】

    2019独角兽企业重金招聘Python工程师标准>>> Spring Boot 系列博客] (0)前言[从零开始学Spring Boot] : http://412887952-qq ...

  3. (38)Spring Boot分布式Session状态保存Redis【从零开始学Spring Boot】

    [本文章是否对你有用以及是否有好的建议,请留言] 在使用spring boot做负载均衡的时候,多个app之间的session要保持一致,这样负载到不同的app时候,在一个app登录之后,而访问到另外 ...

  4. spring boot之session store type is 'null'

    在网上搜索之后,发现session store type使用来存放session的存储方式,目前Spring boot中只支持Redis方式. 由于本应用暂无需将session放入redis的需求,故 ...

  5. spring boot设置session超时时长(自定义spring boot session超时时长)

    针对spring boot 2.0 以下版本(亲测1.5.10)设置session超时的方法如下: 1.添加依赖,代码如下: <dependency><groupId>org. ...

  6. 【转载】Spring Boot 过滤器、监听器、拦截器的使用

    关注"Java后端技术全栈" 回复"面试"获取全套大厂面试资料 在开发中用到过滤器.监听器.拦截器的场景非常多,今天就来聊聊这三者在日常开发中是如何使用的. 概 ...

  7. 学习Spring Boot:(十八)Spring Boot 中session共享

    前言 前面我们将 Redis 集成到工程中来了,现在需要用它来做点实事了.这次为了解决分布式系统中的 session 共享的问题,将 session 托管到 Redis. 正文 引入依赖 除了上篇文章 ...

  8. spring boot 之session的总结

    session封装简单string字符串 controller层 request.getSession().setAttribute("accountName", account. ...

  9. spring boot之session的创建,销毁,超时,监听等等小结

    一. session简介 1. 服务器可以为每个用户浏览器创建一个会话对象(session对象),一个浏览器只能产生一个session,当新建一个窗口访问服务器时,还是原来的那个session.ses ...

最新文章

  1. c++ 类数组_输入输出流IO体系及常用类关系结构(精要收藏)
  2. 目标检测-- DeNet: Scalable Real-time Object Detection with Directed Sparse Sampling
  3. elasticsearch源码分析之search模块(server端)
  4. 云效83行代码重构大师赛-码力全开,重启方舟
  5. findbugs教程
  6. 惠普g260鼠标宏软件_电竞外设再添新成员,微星DS102电竞鼠标正式发布
  7. 火绒弹窗拦截_弹窗广告的克星:火绒安全软件图文使用教程
  8. C++ STL中Map的按Key排序和按Value排序
  9. MySQL/MariaDB Tips
  10. 微信快速开发框架(八)-- V2.3--增加语音识别及网页获取用户信息,代码已更新至Github...
  11. 使用Scala编程计算级数
  12. QT5.14.2+VS2017环境安装
  13. 纯真ip数据库 linux,Python读取纯真IP数据库
  14. Exchange 2010 用户邮箱使用空间统计
  15. 实现一个投票小程序全流程
  16. 数据预处理和特征工程1--无量纲化:数据归一化、标准化
  17. 跟踪线程 深度 双目初始化位姿 运动模型 关键帧模式 重定位 局部地图跟踪 关键帧
  18. 智能硬件的一些框架性内容
  19. 戴尔 DELL R720 LED指示灯错误代称含义
  20. 快应用官网 | 2020年端午假期工作安排

热门文章

  1. 前端常见算法(js)
  2. python global和nonlocal_python中的global和nonlocal
  3. python接口测试框架选择之pytest+yaml+Allure
  4. 比较好的私域电商平台有哪些?
  5. html2canvas边框线,html2canvas如何实现dashed虚线边框?
  6. IOS 特定于设备的开发:使用加速器启动屏幕上的对象
  7. kingbase预研
  8. 【CSS】关于CSS的几种移动端布局方式
  9. idea配置数据库之后schema内没有表数据
  10. 李开复,59岁:与死亡交手后,我给20、30岁年轻人的建议!