You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止指定接口触发会话刷新?(Angular+Spring Boot环境)

问题分析与解决方案

核心问题:同域下轮询请求会自动携带JSESSIONID,导致后端会话持续刷新;即使配置了无状态SecurityFilterChain,Spring Security仍会从Session读取SecurityContext,进而重置会话过期时间。

关键原因

你配置的无状态FilterChain仅设置了SessionCreationPolicy.STATELESS,但Spring Security默认仍会尝试通过HttpSessionSecurityContextRepository加载SecurityContext。只要请求携带JSESSIONID,后端就会读取对应Session,触发会话过期时间刷新。

修复方案

修改无状态FilterChain配置,完全禁用SecurityContext与Session的关联,使用NullSecurityContextRepository替代默认实现,确保后端不读取也不写入Session:

@Bean
@Order(1)
public SecurityFilterChain statelessSecurityFilterChain(HttpSecurity http) throws Exception {
    http
            .antMatcher("/api/vin-exchange/to-validate")
            .authorizeRequests(auth -> auth.anyRequest().permitAll())
            .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            // 禁用SecurityContext从Session加载/写入
            .securityContext(context -> context.securityContextRepository(new NullSecurityContextRepository()))
            .csrf().disable()
            .cors().configurationSource(corsConfigurationSource());

    return http.build();
}

额外验证点

  1. 优先级确认:确保@Order(1)的无状态FilterChain优先级高于有状态的@Order(2),轮询请求会先匹配并走无状态流程。
  2. 请求匹配:antMatcher("/api/vin-exchange/to-validate")会匹配该路径下所有带参数的请求(参数不影响路径匹配),无需修改。
  3. 响应Cookie控制:可在轮询接口的响应中添加Set-Cookie: JSESSIONID=; Max-Age=0,强制浏览器清除该Cookie(可选,进一步避免后续请求携带)。

修改后,后端日志将不再出现HttpSessionSecurityContextRepository相关的Session读取记录,会话过期时间也不会被轮询请求刷新。

内容的提问来源于stack exchange,提问作者Bruno Miguel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 19:20:03