Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。
Session管理
本文主要描述在 Spring Security
下 Session
的以下三种管理,
Session
超时时间Session
的并发策略- 集群环境
Session
处理
Session超时
application.yml
配置超时时间
server: port: 80 session: timeout: 60复制代码
- 配置
http....... .sessionManagement() .invalidSessionUrl("/session/invalid")//session失效跳转的链接.....复制代码
Cotroller
中/session/invalid
@GetMapping("/session/invalid") @ResponseStatus(code = HttpStatus.UNAUTHORIZED) public ResultsessionInvalid() { return ResultUtil.error(HttpStatus.UNAUTHORIZED.value(), "session失效"); }复制代码
效果如下:
Session的并发策略
- 配置
http....... .maximumSessions(1)//最大session并发数量1 .maxSessionsPreventsLogin(false)//false之后登录踢掉之前登录,true则不允许之后登录 .expiredSessionStrategy(new MerryyounExpiredSessionStrategy())//登录被踢掉时的自定义操作.....复制代码
MerryyounExpiredSessionStrategy
@Slf4jpublic class MerryyounExpiredSessionStrategy implements SessionInformationExpiredStrategy { @Override public void onExpiredSessionDetected(SessionInformationExpiredEvent eventØ) throws IOException, ServletException { eventØ.getResponse().setContentType("application/json;charset=UTF-8"); eventØ.getResponse().getWriter().write("并发登录!"); }}复制代码
效果如下:
当maxSessionsPreventsLogin(true)
可参考:和
集群环境Session处理
- 添加spring-session-data-redis依赖
复制代码 org.springframework.session spring-session-data-redis 1.3.1.RELEASE
- 配置Spring-session存储策略
spring: redis: host: localhost port: 6379 session: store-type: redis复制代码
- 测试
8080
和8081
端口分别启动项目
java -jar spring-security.jar --server.port=8080java -jar spring-security.jar --server.port=8081复制代码
效果如下:
关于更多Spring Session可参考:
代码下载
从我的 github 中下载,