我对此非常困惑。我的Web应用程序使用Spring Security,它依赖于JSESSIONID cookie来维护用户会话。
我的一个页面会将302重定向到同一个域中的另一个页面,仍然是http,而不是切换到https或任何花哨的东西。出于某种原因,浏览器(在这种情况下为Chrome)不会通过第二个请求传递cookie,并且用户会丢失其会话。
这是预期的http行为吗?我可能错过了一些东西..
为了清楚起见,cookie已在重定向之前设置,我没有在与重定向相同的响应中设置cookie。
答案 0 :(得分:2)
302不删除任何cookie,因此我认为您正在更改主机/端口或服务器使cookie过期。查看这3个请求(302,302之前,302之后)并搜索与Set-Cookie标头相关的内容并使用过期值。
可能是你的cookie路径有问题,如果你将cookie路径设置为与'/'不同的东西,它将无法被所有路径访问。
答案 1 :(得分:2)
这可能是Chrome中的一个错误。请参阅Chromium bug#696204。在我的情况下,解决方法是将SameSite=Strict
更改为Lax
。
答案 2 :(得分:1)
回答我自己的问题。事实证明,当从post请求重定向时,必须使用303(参见其他)响应。
来自RFC 2616
10.3.4 303见其他
可以在不同的URI下找到对请求的响应 应该使用该资源上的GET方法检索。这种方法 存在主要是为了允许输出POST激活的脚本 将用户代理重定向到选定的资源。新的URI不是 替换最初请求的资源的引用。 303 响应绝不能缓存,而是对第二个的响应 (重定向)请求可能是可缓存的。