Spring Security系列教程19--会话管理之处理会话过期

简介: 前言在上一章节中,一一哥 给各位讲解了HTTP协议、会话、URL重新、会话固定攻击等概念,并且实现了对会话固定攻击的防御拦截。在Spring Security中,其实除了可以对会话固定攻击进行拦截之外,还可以对会话过期进行处理,也就是会话可能会过期,过期了该怎么处理。接下来请各位跟着 壹哥 继续学习,看看会话过期时到底怎么处理的吧。一. 会话过期1. 会话过期概念在处理会话过期之前,我们首先得知道啥是会话过期。所谓的会话过期,是指当用户登录网站后,较长一段时间没有与服务器进行交互,将会导致服务器上的用户会话数据(即session)被销毁。此时,当用户再次操作网页时,如果服务器进

前言

在上一章节中,一一哥 给各位讲解了HTTP协议、会话、URL重新、会话固定攻击等概念,并且实现了对会话固定攻击的防御拦截。

在Spring Security中,其实除了可以对会话固定攻击进行拦截之外,还可以对会话过期进行处理,也就是会话可能会过期,过期了该怎么处理。接下来请各位跟着 壹哥 继续学习,看看会话过期时到底怎么处理的吧。

一. 会话过期

1. 会话过期概念

在处理会话过期之前,我们首先得知道啥是会话过期。

所谓的会话过期,是指当用户登录网站后,较长一段时间没有与服务器进行交互,将会导致服务器上的用户会话数据(即session)被销毁。此时,当用户再次操作网页时,如果服务器进行了session校验,那么浏览器将会提醒用户session超时,导致这个问题的关键词有两个:一个是「长时间」,一个是「未操作」

2. Session的超时时间

既然会话会过期,就得有个过期时间,默认情况下,Session的过期时间是30分钟,当然我们可以在yml配置文件手动修改会话的过期时间。

server:  servlet:    session:#会话过期时间默认是30m过期,最少为1分钟      timeout: 60s

另外会话的过期时间最少为1分钟,即便我们设置为小于60秒,也会被修正为1分钟,在Spring Boot的TomcatServletWebServerFactory类中,对此有默认实现,源码如下:

privatelonggetSessionTimeoutInMinutes() {
DurationsessionTimeout=getSession().getTimeout();
if (isZeroOrLess(sessionTimeout)) {
return0;
 }
returnMath.max(sessionTimeout.toMinutes(), 1);
}
privatebooleanisZeroOrLess(DurationsessionTimeout) {
returnsessionTimeout==null||sessionTimeout.isNegative() ||sessionTimeout.isZero();
}

3. 会话过期时的处理策略

你可能会问,万一会话过期了怎么办呢?别担心!

默认情况下,在会话过期时,Spring Security为我们提供了2种处理策略:

  1. 跳转到某个指定的URL;
  2. 自定义过期策略。

二. 会话过期时的处理策略(一)

在上面的章节中,我给各位介绍了在会话过期时,Spring Security给我们提供了2种处理策略,我们先学习第一种处理策略,即当会话过期时跳转到某个指定的URL,接下来请看代码实现。

1. 配置会话过期时间

为了方便验证测试,我们先把会话的过期时间设置为60秒,这样会话在很短时间内就可以过期。

server:  servlet:    session:#会话过期时间默认是30m过期,最少为1分钟      timeout: 60s

2. 定义测试接口

接下来我们定义几个测试接口,并且定义一个用来处理会话过期的接口“/session/invalid”。

@RestControllerpublicclassUserController {
@GetMapping("/user/hello")
publicStringhelloUser() {
return"hello, user";
    }
@GetMapping("/admin/hello")
publicStringhelloAdmin() {
return"hello, admin";
    }
@GetMapping("/app/hello")
publicStringhelloApp() {
return"hello, app";
    }
@RequestMapping("/logout")
publicvoidlogout(HttpSessionsession){
session.invalidate();
System.out.println("logout执行了...");
    }
//定义一个会话过期后要跳转到的接口@GetMapping("/session/invalid")
publicStringinvalid(){
return"会话过期invalid...";
    }
}

3. 配置跳转到某个URL

我们还是在之前的SecurityConfig类中,进行会话过期效果的配置实现,主要是利用invalidSessionUrl()方法来实现。

@EnableWebSecurity(debug=true)
publicclassSecurityConfigextendsWebSecurityConfigurerAdapter {
@Overrideprotectedvoidconfigure(HttpSecurityhttp) throwsException {
http.authorizeRequests()
                .antMatchers("/admin/**")
                .hasRole("ADMIN")
                .antMatchers("/user/**")
                .hasRole("USER")
                .antMatchers("/app/**")
                .permitAll()
                .anyRequest()
                .authenticated()
                .and()
                .csrf()
                .disable()
                .formLogin()
                .permitAll()
                .and()
                .logout()
                .logoutUrl("/logout")
//注销成功,重定向到该路径下                .logoutSuccessUrl("/login")
//使得session失效                .invalidateHttpSession(true)
//清除认证信息                .clearAuthentication(true)
                .and()
//进行会话管理                .sessionManagement()
                .sessionFixation()
//设置会话固定防御策略                .migrateSession()
//配置会话过期策略                .invalidSessionUrl("/session/invalid");
    }
@BeanpublicPasswordEncoderpasswordEncoder() {
returnNoOpPasswordEncoder.getInstance();
    }
}

4. 启动测试

我们把项目重启,然后访问/user/hello接口,在我们登陆认证成功后就可以正常访问/user/hello接口。

这时候如果我们把当前窗口页面关闭,经过60秒后,会话就会过期,等再次访问/user/hello接口,就可以看到如下效果,即跳转到了我们指定的会话过期界面。

三. 会话过期时的处理策略(二)

我在上面说了,会话过期之后的处理策略,除了上面跳转到指定的URL方案之外,我们还可以自定义会话过期策略,其代码如下。

1. 自定义MyInvalidSessionStrategy类

我们创建一个MyInvalidSessionStrategy类,实现InvalidSessionStrategy接口,在这里进行会话过期时的处理逻辑。

//我们先定义一个处理会话过期的策略类publicclassMyInvalidSessionStrategyimplementsInvalidSessionStrategy {
@OverridepublicvoidonInvalidSessionDetected(HttpServletRequestrequest, HttpServletResponseresponse) throwsIOException, ServletException {
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("session无效");
    }
}

2. 配置自定义过期策略

接下来我们把上面定义的MyInvalidSessionStrategy类,通过invalidSessionStrategy()方法,设置自定义的会话过期策略。

//然后在配置文件中关联处理会话过期策略@EnableWebSecurity(debug=true)
publicclassSecurityConfigextendsWebSecurityConfigurerAdapter {
@Overrideprotectedvoidconfigure(HttpSecurityhttp) throwsException {
http.authorizeRequests()
                .antMatchers("/admin/**")
                .hasRole("ADMIN")
                .antMatchers("/user/**")
                .hasRole("USER")
                .antMatchers("/app/**")
                .permitAll()
                .anyRequest()
                .authenticated()
                .and()
                .csrf()
                .disable()
                .formLogin()
                .permitAll()
                .and()
                .logout()
                .logoutUrl("/logout")
//注销成功,重定向到该路径下                .logoutSuccessUrl("/login")
//使得session失效                .invalidateHttpSession(true)
//清除认证信息                .clearAuthentication(true)
                .and()
//进行会话管理                .sessionManagement()
                .sessionFixation()
//设置会话固定防御策略                .migrateSession()
//配置会话过期策略//.invalidSessionUrl("/session/invalid")//设置会话过期策略                .invalidSessionStrategy(newMyInvalidSessionStrategy());
    }
@BeanpublicPasswordEncoderpasswordEncoder() {
returnNoOpPasswordEncoder.getInstance();
    }
}

至此,壹哥就带各位实现了在会话过期时的代码处理方案了,你学会了吗?

相关文章
|
11月前
|
JSON 安全 Java
什么是JWT?如何使用Spring Boot Security实现它?
什么是JWT?如何使用Spring Boot Security实现它?
1954 5
|
2月前
|
存储 安全 Java
管理 Spring 微服务中的分布式会话
在微服务架构中,管理分布式会话是确保用户体验一致性和系统可扩展性的关键挑战。本文探讨了在 Spring 框架下实现分布式会话管理的多种方法,包括集中式会话存储和客户端会话存储(如 Cookie),并分析了它们的优缺点。同时,文章还涵盖了与分布式会话相关的安全考虑,如数据加密、令牌验证、安全 Cookie 政策以及服务间身份验证。此外,文中强调了分布式会话在提升系统可扩展性、增强可用性、实现数据一致性及优化资源利用方面的显著优势。通过合理选择会话管理策略,结合 Spring 提供的强大工具,开发人员可以在保证系统鲁棒性的同时,提供无缝的用户体验。
|
3月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
674 3
|
2月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
529 5
|
4月前
|
Java Linux 网络安全
Linux云端服务器上部署Spring Boot应用的教程。
此流程涉及Linux命令行操作、系统服务管理及网络安全知识,需要管理员权限以进行配置和服务管理。务必在一个测试环境中验证所有步骤,确保一切配置正确无误后,再将应用部署到生产环境中。也可以使用如Ansible、Chef等配置管理工具来自动化部署过程,提升效率和可靠性。
523 13
|
5月前
|
安全 Java 数据库
Spring Boot 框架深入学习示例教程详解
本教程深入讲解Spring Boot框架,先介绍其基础概念与优势,如自动配置、独立运行等。通过搭建项目、配置数据库等步骤展示技术方案,并结合RESTful API开发实例帮助学习。内容涵盖环境搭建、核心组件应用(Spring MVC、Spring Data JPA、Spring Security)及示例项目——在线书店系统,助你掌握Spring Boot开发全流程。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
798 3
|
7月前
|
人工智能 缓存 自然语言处理
保姆级Spring AI 注解式开发教程,你肯定想不到还能这么玩!
这是一份详尽的 Spring AI 注解式开发教程,涵盖从环境配置到高级功能的全流程。Spring AI 是 Spring 框架中的一个模块,支持 NLP、CV 等 AI 任务。通过注解(如自定义 `@AiPrompt`)与 AOP 切面技术,简化了 AI 服务集成,实现业务逻辑与 AI 基础设施解耦。教程包含创建项目、配置文件、流式响应处理、缓存优化及多任务并行执行等内容,助你快速构建高效、可维护的 AI 应用。
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
807 2

热门文章

最新文章

下一篇
oss云网关配置