Spring Security 中跨 request 请求保持 SecurityContext

本文介绍Spring Security如何通过SecurityContextPersistenceFilter实现跨请求的安全上下文保持。在一个Servlet Web应用中,针对不同请求间的同一用户会话,Spring Security利用HttpSession保存安全上下文,确保各请求间的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在一个ServletWeb应用中,对于一个请求进行处理的全过程,服务端使用的是同一个线程,通过利用SecurityContextHolderMODE_THREADLOCAL安全上下文SecurityContext保持机制,无论该处理过程中使用到了哪些对象的哪些方法,这些方法内都可以获得当前访问者的安全上下文SecurityContext。但是,如果跨多个请求需要保持同样的安全上下文SecurityContext,又该怎么办呢?

这种需求很常见,同一个用户登录之后会对服务器发起多次请求,每次请求用到的安全上下文SecurityContext都应该是一样的。

Spring Security中,跨请求安全上下文SecurityContext的保持,是通过SecurityContextPersistenceFilter来实现的,缺省情况下,SecurityContextPersistenceFilter将安全上下文SecurityContext对象保存为当前用户HttpSession对象的一个属性,这样,当前用户在同一个会话的多个请求之间,就可以使用同一个安全上下文对象了。

具体来讲,可以理解为如下流程:

  • 一个安全上下文在某个请求1处理过程中被创建并记录到SecurityContextHolder
  • 请求1的处理结束时,SecurityContextPersistenceFilter会将SecurityContextHolder中的安全上下文保存到HttpSession;
  • 后续该用户会话中的另外一个请求2处理过程开始时,SecurityContextPersistenceFilter会将安全上下文从HttpSession恢复到SecurityContextHolder;
  • 请求2处理过程结束时,SecurityContextPersistenceFilter会将SecurityContextHolder中的安全上下文保存到HttpSession;
  • 后续其他请求的处理过程会重复和上面请求2处理过程中一样的使用SecurityContextPersistenceFilter重置/恢复SecurityContext的动作。

另外还有一些应用是不使用Session机制的,比如无状态的Restful API,这类接口需要每次认证。但是对于这种请求的处理过程,SecurityContextPersistenceFilter还是会被使用到,它被用来在每个请求处理结束时清除SecurityContextHolder中的安全上下文。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值