无状态弹簧应用程序 - JSESSIONID 仍然生成

Posted

技术标签:

【中文标题】无状态弹簧应用程序 - JSESSIONID 仍然生成【英文标题】:Stateless spring application - JSESSIONID still generated 【发布时间】:2019-09-16 04:39:22 【问题描述】:

我正在尝试使 java web 应用程序真正无状态(尽管仍然使用基本身份验证),但现在 JSESSIONID cookie 总是由我们的 servlet 容器 (Tomcat) 生成。

这是我的堆栈:

Java: 1.8
Spring: 4.1.6.RELEASE
Spring Security: 4.0.2.RELEASE
Tomcat: 7.0.93

我们使用 XML 配置,所以这是我的安全配置文件,我使用 STATELESS 选项来创建会话:

<beans:bean id="requestCache" class="org.springframework.security.web.savedrequest.NullRequestCache" />

<http use-expressions="true" create-session="stateless" pattern="/api/**">
        <request-cache ref="requestCache"/>
        <csrf disabled="true"/>

        <!-- REST ENDPOINTS PATH BASED -->
        <intercept-url pattern="...."/>
        <intercept-url pattern="...."/>
</http>

正如response 中所述,这应该足以确保 Spring Security 不会创建会话,但我的应用程序的其他部分仍然可以创建会话。

问题是:我如何跟踪谁在请求创建会话?

基本上,我要做的是调整有状态 Java 应用程序使用的后端,以供其他客户端应用程序以无状态方式使用,这些客户端应用程序只会调用特定路径 (/api/**),详见我的安全配置文件。

这个有状态的部分使用了一些 session-scoped 的 bean;我需要以 request-scope 方式使用这些相同的 bean,因此我需要确保永远不会创建 JSESSIONID cookie。

例如尝试在 Tomcat(或浏览器)中禁用 cookie altogheter 来实现这一点,所以我正在尝试一种直接使用 Spring 的方法。

【问题讨论】:

【参考方案1】:

如果您想确保没有创建会话,请创建一个过滤器并将HttpServletRequest 包装为一个阻止/失败/忽略getSession(...) 调用的类。

【讨论】:

以上是关于无状态弹簧应用程序 - JSESSIONID 仍然生成的主要内容,如果未能解决你的问题,请参考以下文章

弹簧靴白标404

登录后如何刷新 JSESSIONID cookie

如何用关节无弹性地拖动物体

在不同的应用服务器上生成新的 JSESSIONID

session

[转]session 跨域共享方案