《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 http://niocoder.com/2018/01/19/Spring-Security源码分析九-Spring-Security-Session管理/ 「龙飞」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

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

1. Session管理

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

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

1.1 Session超时

  1. application.yml配置超时时间

    server:
    port: 80
    session:
    timeout: 60

  2. 配置MerryyouSecurityConfig

    http.
    ......
    .sessionManagement()
    .invalidSessionUrl("/session/invalid")//session失效跳转的链接
    .....

  3. 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的并发策略

  1. 配置MerryyouSecurityConfig

    http.
    ......
    .maximumSessions(1)//最大session并发数量1
    .maxSessionsPreventsLogin(false)//false之后登录踢掉之前登录,true则不允许之后登录
    .expiredSessionStrategy(new MerryyounExpiredSessionStrategy())//登录被踢掉时的自定义操作
    .....

  2. 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("并发登录!");
    }
    }

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

maxSessionsPreventsLogin(true)可参考:Spring-Securitysecurity-oauth2

1.3 集群环境Session处理

  1. 添加spring-session-data-redis依赖

<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>

  1. 配置Spring-session存储策略

spring:
redis:
host: localhost
port: 6379
session:
store-type: redis

  1. 测试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

文章目录
  1. 1. 1. Session管理
    1. 1.1. 1.1 Session超时
    2. 1.2. 1.2 Session的并发策略
    3. 1.3. 1.3 集群环境Session处理
  2. 2. 2. 代码下载