如何修复“会话已失效”异常?

问题描述 投票:0回答:1

我有一个端点(/logout),可以通过调用 HttpSession#invalidate() 手动使会话无效。有时我会遇到以下异常(在 1000 个请求内,它会发生大约十几次):

java.lang.IllegalStateException: Session was invalidated
at org.springframework.session.data.redis.RedisSessionRepository.save(RedisSessionRepository.java:129)
at org.springframework.session.data.redis.RedisSessionRepository.save(RedisSessionRepository.java:45)
at org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.commitSession(SessionRepositoryFilter.java:229)
at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:145)
at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:82)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)
        2 lines skipped for [org.apache.catalina]
at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:109)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
        2 lines skipped for [org.apache.catalina]

看起来会话在失效后尝试保存。有没有办法防止会话失效后保存,或者有没有办法确保保存后写入无效状态?

我在这里发现了类似的案例https://github.com/spring-projects/spring-security/pull/9128#issuecomment-984972101但它与spring security有关。

我发现 SessionRepositoryFilter#commitSession() 处有一个当前会话对象,尽管它应该已从当前请求中删除。

Spring boot 3.2.3(不带 spring security)、Spring Cloud dependentecy 2023.0.1、Redisson 和 RedisIndexedSessionRepository 使用了lushmode:on_save 和 savemode:on_set_attribute。该服务位于 Spring Cloud Gateway 后面。

看来Spring cloud gateway对这个错误有影响。当我在没有网关的情况下进行测试时,不会发生异常。

spring-boot spring-cloud-gateway spring-session
1个回答
0
投票

有助于减少异常数量的是将flushMode 设置为IMMEDIATE。

@EnableRedisHttpSession(redisNamespace = "my_session",flushMode = FlushMode.IMMEDIATE,saveMode = SaveMode.ON_SET_ATTRIBUTE)
© www.soinside.com 2019 - 2024. All rights reserved.