如何防止 tomcat 中具有基本身份验证的 servlet 中的会话?



我正在使用spring-boot-starter-web创建一个部署在独立tomcat8上的war应用程序。

@EnableWebSecurity在每个 servlet 请求上强制basic-authentication,并保护 gui。

但主要目的是提供主要通过编程方式访问的 Web 服务 XML。因此,客户端始终使用basic-auth发送其GET请求。

问题:tomcat 将为每个请求创建一个新会话!当客户端以编程方式连接到 xml servlet 时,会话永远不会注销。并且也不会重用,因为下一个客户端请求将再次传输基本身份验证。

因此,这些会话驻留在雄猫中,直到超时(例如默认 30 分钟(。并同时消耗内存。

问题:如何告诉 tomcat 或 spring-servlet,提供基本身份验证http 标头的连接不需要创建会话?只需对用户进行身份验证,发送响应并忘记会话信息?

您可以将会话创建策略设置为SessionCreationPolicy.STATELESS

Spring Security 永远不会

创建 HttpSession,也永远不会使用它来获取 SecurityContext

将其设置为您的WebSecurityConfiguration,例如:

http.antMatcher("/api/**")
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);

SessionCreationPolicy.NEVER是这里的正确答案。因为它默认情况下不会创建会话。但是,如果请求会话(例如,由于我的/gui 路径中的表单登录(,它将被使用。

这样,任何编程请求都不会创建会话。但是,如果在 Web 浏览器中进行测试(因此通过表单登录提供基本身份验证进行保护(,则会创建会话。这是所需的行为,因为在每次从浏览器中发送请求时,没有人愿意每次输入基本身份验证凭据。

http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER);

最新更新