Spring Boot 之 session监听器
参考: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监听器相关推荐
- spring boot 分布式session实现
spring boot 分布式session实现 主要是通过包装 HttpServletRequest 将 session 相关的方法进行代理. 具体是的实现就是通过 SessionRepositor ...
- (21)Spring Boot过滤器、监听器【从零开始学Spring Boot】
2019独角兽企业重金招聘Python工程师标准>>> Spring Boot 系列博客] (0)前言[从零开始学Spring Boot] : http://412887952-qq ...
- (38)Spring Boot分布式Session状态保存Redis【从零开始学Spring Boot】
[本文章是否对你有用以及是否有好的建议,请留言] 在使用spring boot做负载均衡的时候,多个app之间的session要保持一致,这样负载到不同的app时候,在一个app登录之后,而访问到另外 ...
- spring boot之session store type is 'null'
在网上搜索之后,发现session store type使用来存放session的存储方式,目前Spring boot中只支持Redis方式. 由于本应用暂无需将session放入redis的需求,故 ...
- spring boot设置session超时时长(自定义spring boot session超时时长)
针对spring boot 2.0 以下版本(亲测1.5.10)设置session超时的方法如下: 1.添加依赖,代码如下: <dependency><groupId>org. ...
- 【转载】Spring Boot 过滤器、监听器、拦截器的使用
关注"Java后端技术全栈" 回复"面试"获取全套大厂面试资料 在开发中用到过滤器.监听器.拦截器的场景非常多,今天就来聊聊这三者在日常开发中是如何使用的. 概 ...
- 学习Spring Boot:(十八)Spring Boot 中session共享
前言 前面我们将 Redis 集成到工程中来了,现在需要用它来做点实事了.这次为了解决分布式系统中的 session 共享的问题,将 session 托管到 Redis. 正文 引入依赖 除了上篇文章 ...
- spring boot 之session的总结
session封装简单string字符串 controller层 request.getSession().setAttribute("accountName", account. ...
- spring boot之session的创建,销毁,超时,监听等等小结
一. session简介 1. 服务器可以为每个用户浏览器创建一个会话对象(session对象),一个浏览器只能产生一个session,当新建一个窗口访问服务器时,还是原来的那个session.ses ...
最新文章
- c++ 类数组_输入输出流IO体系及常用类关系结构(精要收藏)
- 目标检测-- DeNet: Scalable Real-time Object Detection with Directed Sparse Sampling
- elasticsearch源码分析之search模块(server端)
- 云效83行代码重构大师赛-码力全开,重启方舟
- findbugs教程
- 惠普g260鼠标宏软件_电竞外设再添新成员,微星DS102电竞鼠标正式发布
- 火绒弹窗拦截_弹窗广告的克星:火绒安全软件图文使用教程
- C++ STL中Map的按Key排序和按Value排序
- MySQL/MariaDB Tips
- 微信快速开发框架(八)-- V2.3--增加语音识别及网页获取用户信息,代码已更新至Github...
- 使用Scala编程计算级数
- QT5.14.2+VS2017环境安装
- 纯真ip数据库 linux,Python读取纯真IP数据库
- Exchange 2010 用户邮箱使用空间统计
- 实现一个投票小程序全流程
- 数据预处理和特征工程1--无量纲化:数据归一化、标准化
- 跟踪线程 深度 双目初始化位姿 运动模型 关键帧模式 重定位 局部地图跟踪 关键帧
- 智能硬件的一些框架性内容
- 戴尔 DELL R720 LED指示灯错误代称含义
- 快应用官网 | 2020年端午假期工作安排
热门文章
- 前端常见算法(js)
- python global和nonlocal_python中的global和nonlocal
- python接口测试框架选择之pytest+yaml+Allure
- 比较好的私域电商平台有哪些?
- html2canvas边框线,html2canvas如何实现dashed虚线边框?
- IOS 特定于设备的开发:使用加速器启动屏幕上的对象
- kingbase预研
- 【CSS】关于CSS的几种移动端布局方式
- idea配置数据库之后schema内没有表数据
- 李开复,59岁:与死亡交手后,我给20、30岁年轻人的建议!