Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Spring Security中为新登录用户创建新cookie_Java_Spring Security_Session Cookies - Fatal编程技术网

Java 如何在Spring Security中为新登录用户创建新cookie

Java 如何在Spring Security中为新登录用户创建新cookie,java,spring-security,session-cookies,Java,Spring Security,Session Cookies,我正在使用SpringSecurity3.0和SpringMVC。我的Java Web应用程序是一个购物车。我使用的服务在会话中存储购物列表,当用户a创建购物列表,然后继续注销并再次登录时,购物列表将恢复为正常状态,但是如果另一个用户B使用相同的浏览器进入相同的应用程序并继续登录,则会话将使用用户a!的购物列表恢复 我能理解的是,当用户在同一浏览器中注销时,JSESSION cookie不会改变。这就是为什么如果用户使用另一个浏览器登录到应用程序,他没有相同的会话数据,那么JSESSION co

我正在使用SpringSecurity3.0和SpringMVC。我的Java Web应用程序是一个购物车。我使用的服务在会话中存储购物列表,当用户a创建购物列表,然后继续注销并再次登录时,购物列表将恢复为正常状态,但是如果另一个用户B使用相同的浏览器进入相同的应用程序并继续登录,则会话将使用用户a!的购物列表恢复

我能理解的是,当用户在同一浏览器中注销时,JSESSION cookie不会改变。这就是为什么如果用户使用另一个浏览器登录到应用程序,他没有相同的会话数据,那么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”可能是一个短期解决方案,但这样我就无法使用会话中保存的数据


我想要的是,当UserA登录到浏览器时,将一些数据保存到会话(购物列表),然后注销,让UserB拥有自己的会话,而不是使用UserA的会话,我怀疑答案是向UserB分配一个新cookie,但也向UserA分配旧cookie

最接近的元素是
元素

  • 如果将
    会话固定保护
    属性设置为
    “migrateSession”
    ,则新令牌将具有旧令牌的会话属性

  • 如果将其设置为
    “newSession”
    ,会话属性将被丢弃

有关更多详细信息,请参阅


我想要的是,当UserA登录到浏览器时,将一些数据保存到会话(购物列表),然后注销,让UserB拥有自己的会话,而不是使用UserA的会话,我怀疑答案是向UserB分配一个新cookie,但也向UserA分配旧cookie


我不认为仅仅通过更改会话令牌就可以实现这一点。问题是浏览器只存储一个会话令牌。一旦令牌被更改,浏览器就不知道旧令牌的值,服务器也不知道谁拥有旧令牌。如果您希望购物列表在会话结束后(即UserA注销后)保持不变,则必须将其保持在其他位置。

您需要将购物车存储在DB中,而不是会话中。您还需要一个cron作业来清除过时的购物车,这样它们就不会填满数据库。

如果购物车在会话中,并且当用户注销时会话没有失效,那么购物车在该浏览器中仍然处于活动状态,不是吗?我猜他们只是没有访问权限,因为所有购物车页面都要求您登录?是的,购物车页面要求您登录。当我登录时,JSESSION不会改变,因此任何登录的用户都会获得与前一个用户相同的会话我想你的意思是
newSession
-创建一个新的“干净”会话,而不复制现有会话数据,而不是
migrateSession
(因为新用户会获得旧用户的购物车)。但是没有办法恢复旧会话。我想你是对的,会话的数据必须保存在其他地方。这可能是一个间接的解决方案,但我希望可能会有与Spring Security更相关的东西,或者可能使用两个cookie,每个浏览器一个,每个用户一个。我会等待更多的时间,看看其他答案谢谢。