【问题标题】:How to prevent sessions in a tomcat for servlets with basic-auth?如何防止具有基本身份验证的 servlet 在 tomcat 中的会话?
【发布时间】:2018-01-30 21:44:27
【问题描述】:

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

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

但主要目的是提供 Web 服务 XML,主要以编程方式访问。因此,客户端总是使用 basic-auth 发送他们的GET 请求。

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

所以这些会话驻留在tomcat 中直到超时(例如默认30 分钟)。同时消耗内存。

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

【问题讨论】:

标签: java spring tomcat tomcat8


【解决方案1】:

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

Spring Security 永远不会创建 HttpSession 并且永远不会使用它来获取 SecurityContext

在你的WebSecurityConfiguration中设置如:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 很高兴您找到适用于所有情况的会话创建策略,但您也可以在不同的端点集上应用不同的策略,例如 http.antMatcher("/api/**").sessionManagement().sessionCreationPolicy(.....)
    猜你喜欢
    • 2016-10-17
    • 2018-11-29
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 2011-09-27
    • 2012-09-16
    • 2020-06-15
    相关资源
    最近更新 更多