Spring Security 源码分析九:Spring Security Session 管理

Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。

1. Session管理

本文主要描述在 Spring Security下 Session的以下三种管理,

  1. Session超时时间
  2. Session的并发策略
  3. 集群环境Session处理

1.1 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 Result<String> sessionInvalid() {
        return ResultUtil.error(HttpStatus.UNAUTHORIZED.value(), "session失效");
    }

效果如下:https://raw.githubusercontent.com/longfeizheng/longfeizheng.github.io/master/images/security/Spring-Security-sessionTimeout.gif

1.2 Session的并发策略

http.
......
	       .maximumSessions(1)//最大session并发数量1
           .maxSessionsPreventsLogin(false)//false之后登录踢掉之前登录,true则不允许之后登录
           .expiredSessionStrategy(new MerryyounExpiredSessionStrategy())//登录被踢掉时的自定义操作
.....
  • MerryyounExpiredSessionStrategy 
@Slf4j
public 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)可参考:Spring-Securitysecurity-oauth2

1.3 集群环境Session处理

  • 添加spring-session-data-redis依赖
<dependency>
	<groupId>org.springframework.session</groupId>
	<artifactId>spring-session-data-redis</artifactId>
	<version>1.3.1.RELEASE</version>
</dependency>
  • 配置Spring-session存储策略 
spring:
  redis:
    host: localhost
    port: 6379
  session:
    store-type: redis
  • 测试80808081端口分别启动项目 
java -jar spring-security.jar --server.port=8080
java -jar spring-security.jar --server.port=8081

效果如下:

https://raw.githubusercontent.com/longfeizheng/longfeizheng.github.io/master/images/security/Spring-Security-session02.gif

关于更多Spring Session可参考:程序猿DD

2. 代码下载

从我的 github 中下载,https://github.com/longfeizheng/logback

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值