我正在使用 Spring Security 3.0 和 Spring MVC。我的 Java Web 应用程序是一个购物车。我正在使用在 session 中存储购物 list 的服务,当用户 A 创建购物 list ,然后注销并再次登录时,购物 list 将恢复正常,但如果另一个用户 B 访问同一个应用程序,使用相同的浏览器并继续登录, session 将使用用户 A 的购物 list 恢复!
我能理解的是,当用户 A 在同一浏览器中注销时,JSESSION cookie 不会改变。这就是为什么如果用户 A 使用其他浏览器登录应用程序,他没有相同的 session 数据,JSESSION cookie 是不同的。
我正在使用自己的身份验证成功处理程序进行登录和注销。
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/index.html" access="permitAll"/>
<form-login login-page="/index.html"
default-target-url="/index.html"
authentication-success-handler-ref = "loginSuccessHandler"
/>
<logout invalidate-session="false" logout-url="/logout" success-handler-ref="logoutSuccessHandler" />
<!-- <logout invalidate-session="false" success-handler-ref="logoutSuccessHandler" /> -->
</http>
是的,使用 invalidate-session = "true"可能是一个短期解决方案,但这样我就无法使用 session 中保存的数据。
我想要的是,当UserA登录浏览器时,将一些数据保存到 session (购物 list ),然后注销,使UserB拥有自己的 session ,而不是使用UserA的 session ,我怀疑答案不仅将新的 cookie 分配给 userB,而且还将旧的 cookie 分配给 UserA。
最佳答案
您将得到的最接近的是 <session-managemement>
元素。
如果您设置
session-fixation-protection
属性设置为"migrateSession"
,新 token 将具有旧 token 的 session 属性。如果将其设置为
"newSession"
session 属性将被丢弃。
请参阅SpringSecurity manual了解更多详情。
<小时/>What i want is that when UserA log in a browser, save some data to session (the shopping list), and then logout, make UserB have his own session, instead of using the session of UserA, i suspect that the answer is in asigning a new cookie to userB, but also, to asign the old cookie to UserA.
我认为您无法通过简单地更改 session token 来实现此目的。问题是浏览器只存储一个 session token 。一旦 token 被更改,浏览器就不知道旧 token 的值,服务器也不知道谁拥有旧 token 。如果您希望购物 list 在 session 结束后(即用户 A 注销后)持续存在,则必须将其保留在其他地方。
关于java - 如何为新登录用户创建新的 cookie Spring Security,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6300299/