Session: 在计算机中, 尤其是在网络应用中, 称为 "会话控制".Session 对象存储特定用户会话所需的属性及配置信息. 这样, 当用户在应用程序的 web 页之间跳转时, 存储在 Session 对象中的变量将不会丢失, 而是在整个用户会话中一直存在下去. 当用户请求来自应用程序的 Web 页时, 如果该用户还没有会话, 则 Web 服务器将自动创建一个 Session 对象. 当会话过期或被放弃后, 服务器将终止该会话. Session 对象最常见的一个用法就是存储用户的首选项.
Session 管理
本文主要描述在 Spring Security 下 Session 的以下三种管理,
Session 超时时间
Session 的并发策略
集群环境 Session 处理
Session 超时
application.YAML 配置超时时间
- server:
- port: 80
- session:
- timeout: 60
配置 MerryyouSecurityConfig
- 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 失效");
- }
Session 的并发策略
配置 MerryyouSecurityConfig
- 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-Security
集群环境 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
测试 8080 和 8081 端口分别启动项目
- java -jar spring-security.jar --server.port=8080
- java -jar spring-security.jar --server.port=8081
效果如下:
关于更多 Spring Session 可参考: 程序猿 DD http://blog.didispace.com/tags/Spring-Session/
代码下载
从我的 GitHub 中下载, https://github.com/longfeizheng/logback
来源: https://juejin.im/post/5c19dcbe6fb9a049d97525f4