Spring Security Session管理

一、前言

用户登录成功后,信息保存在服务器Session中,这节学习下如何管理这些Session。这节将在《Spring Security短信验证码登录》的基础上继续扩展。

二、Session超时设置

2.1 applacition.yml配置

Session超时时间也就是用户登录的有效时间。要设置Session超时时间很简单,只需要在配置文件中添加:

yml 复制代码
server:
  servlet:
    session:
      timeout: 60S

SpringBoot2.0以后的版本,server.servlet.session.timeout取值依据;之前在server.session.timeout路径配置;timeout取值字符串方式,默认为正,负以-开头,紧接着P,以下字母不区分大小写 D :天 T:天和小时之间的分隔符 H :小时 M:分钟 S:秒 每个单位都必须是数字,且时分秒顺序不能乱。比如P2dt3m5s P3d pt3h

2.2 配置Session管理器

Session失效后,刷新页面后将跳转到认证页面,我们可以再添加一些配置,自定义Session失效后的一些行为。

在Spring Security中配置Session管理器,并配置Session失效后要跳转的URL:

java 复制代码
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.addFilterBefore(smsCodeFilter, UsernamePasswordAuthenticationFilter.class) // 添加短信验证码校验过滤器
                .formLogin() // 表单登录
                // http.httpBasic() // HTTP Basic
                //.loginPage("/login.html")
                .loginPage("/authentication/require") // 登录跳转 URL
                .loginProcessingUrl("/login")
                .successHandler(authenticationSucessHandler) // 处理登录成功
                .failureHandler(authenticationFailureHandler) // 处理登录失败
                .and()
                .authorizeRequests() // 授权配置
                //.antMatchers("/login.html").permitAll()
                .antMatchers("/authentication/require", "/login.html",
                        "/code/sms", "/session/invalid").permitAll() // 登录跳转 URL 无需认证
                .anyRequest()  // 所有请求
                .authenticated() // 都需要认证
                .and()
                .sessionManagement() // 添加 Session管理器
                .invalidSessionUrl("/session/invalid") // Session失效后跳转到这个链接
                .and()
                .csrf().disable()
                .apply(smsAuthenticationConfig); // 将短信验证码认证配置加到 Spring Security 中;
    }

上面配置了Session失效后跳转到/session/invalid,并且将这个URL添加到了免认证路径中。

2.3 编写失效Controller

在Controller里添加一个方法,映射该请求:

java 复制代码
    @GetMapping("session/invalid")
    @ResponseStatus(HttpStatus.UNAUTHORIZED)
    public String sessionInvalid(){
        return "session已失效,请重新认证";
    }

2.4 测试

为了演示,我们将Session的超时时间设置为最小值60秒,重启项目,认证后等待60秒并刷新页面:

三、Session集群处理

Session集群听着高大上,其实实现起来很简单。当我们登录成功后,用户认证的信息存储在Session中,而这些Session默认是存储在运行运用的服务器上的,比如Tomcat,netty等。当应用集群部署的时候,用户在A应用上登录认证了,后续通过负载均衡可能会把请求发送到B应用,而B应用服务器上并没有与该请求匹配的认证Session信息,所以用户就需要重新进行认证。要解决这个问题,我们可以把Session信息存储在第三方容器里(如Redis集群),而不是各自的服务器,这样应用集群就可以通过第三方容器来共享Session了。

3.1 引入依赖

我们引入Redis和Spring Session依赖:

xml 复制代码
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

3.2 application.yml配置

然后在yml中配置Session存储方式为Redis:

yml 复制代码
spring:
  session:
    store-type: redis
  redis:
    database: 0
    # Redis服务器地址
    host: 127.0.0.1
    # Redis服务器连接端口
    port: 10007
    # Redis服务器连接密码
    password:
    pool:
      max-active: 8
      max-idle: 5
      max-wait: 5000
      min-idle: 1
    timeout: 0

3.3 配置集群服务

为了方便,Redis配置采用默认配置即可。

开启Redis,并且启动两个应用实例,一个端口为8080,另一个端口为9090。

复制一个服务,增加启动参数:

server.port=8090

3.4 测试

我们现在8080端口应用上登录:

然后访问9090端口应用的主页:

可以看到登录也是生效的。这就实现了集群化Session管理。

相关推荐
2301_780789663 小时前
跨平台适配!SDK 游戏盾兼容全终端游戏场景
java·网络·ddos
学长毕设4 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端
滴滴答答哒5 小时前
ASP.NET Core + FaceRecognitionDotNet 人脸识别实战:DI 单例、特征向量持久化与 1:N 比对
后端·asp.net
步行cgn5 小时前
FormHttpMessageConverter 详解:Spring MVC 中表单数据的读写转换器
java·spring·mvc
龙亘川5 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
金銀銅鐵5 小时前
[Java] 用 CLI 展示 EnumMap 增删键值对时的内部变化
java·源码·ai编程
秋天的怀念_David5 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Raas1006 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
niucloud-admin6 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
霸道流氓气质7 小时前
智能客服组件:分层意图识别、RAG Advisor 与人工转接状态机的 Vue3 + Spring AI 生产级实战
java·人工智能·spring