如何在使用 Spring 会话的项目中设置忽略 URL

Posted

技术标签:

【中文标题】如何在使用 Spring 会话的项目中设置忽略 URL【英文标题】:How to set the ignoring URL in a project that uses spring session 【发布时间】:2021-08-21 05:50:08 【问题描述】:

使用spring boot同时集成spring session和spring actuator。由于使用了prometheus监控,它会周期性的发起http请求进行健康检查和性能监控,但是每个请求都会产生一个新的会话,由于使用了会话共享。会话存储在redis中,会产生大量无用的会话。目前有没有更好的解决方案?

【问题讨论】:

【参考方案1】:

我在github上发现了一个类似的问题,问题还是悬而未决,不过问题中已经有人提出了解决方案,链接如下:Is it possible to exclude some url from the SessionRepositoryFilter。

示例代码使用过滤器集SessionRepositoryFilter.FILTERED

@Component
@Order(Integer.MIN_VALUE)
public class ExcludeSessionRepositoryFilter extends OncePerRequestFilter 

  @Override
  protected void doFilterInternal(HttpServletRequest httpRequest, HttpServletResponse httpResponse,
        FilterChain filterChain) throws ServletException, IOException 
      if (/* here goes your logic to exclude the session repository filter, probably depending on the request uri */) 
        httpRequest.setAttribute("org.springframework.session.web.http.SessionRepositoryFilter.FILTERED", Boolean.TRUE);
      
      filterChain.doFilter(httpRequest, httpResponse);
   

当然,还有另一种方案可以完成springboot和spring security的集成。集成完成后,由于SessionManagementConfigurer的存在,可以调整SessionCreationPolicy enumeration parameters,调整会话创建策略。它的默认值是SessionCreationPolicy.IF_REQUIRED,只有经过测试登录后,session才会同步到redis,比较符合session共享的概念。

【讨论】:

以上是关于如何在使用 Spring 会话的项目中设置忽略 URL的主要内容,如果未能解决你的问题,请参考以下文章

Java中设置Session过期时间(Spring Boot)

如何在 django 中设置会话永不过期

如何在 Spring Boot 中设置相当于 Jetty 的“maxFormContentSize”?

如何在 Capybara 中设置会话值?

如何在 web.config 中设置会话超时

如何使用 WebFlux 在 Spring Boot 2 中设置登录页面?