无状态弹簧应用程序 - 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 仍然生成的主要内容,如果未能解决你的问题,请参考以下文章