在 spring boot 中跨子域共享 cookie

Share a cookie across subdomains in springboot

我有一个托管在 https://example.com. I would like to share a session cookie between the main domain https://example.com and sub-domain https://www.example.com 的 Web 应用程序。因此,如果用户从一个域切换到另一个域,则无需重新登录。我如何在 springboot 2.2.6 中实现这一点?

这是我试过的: 我去了application.properties并设置了server.servlet.session.cookie.domain=.example.com 现在,这没有帮助。我收到一个错误:

java.lang.IllegalArgumentException: An invalid domain [.example.com] was specified for this cookie
    at org.apache.tomcat.util.http.Rfc6265CookieProcessor.validateDomain(Rfc6265CookieProcessor.java:210) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
    at org.apache.tomcat.util.http.Rfc6265CookieProcessor.generateHeader(Rfc6265CookieProcessor.java:145) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
    at org.apache.catalina.connector.Response.generateCookieString(Response.java:973) ~[tomcat-embed-core-9.0.33.jar:9.0.33]

如果我设置 server.servlet.session.cookie.domain=example.com,则 cookie 对 http://www.example.com and if I set server.servlet.session.cookie.domain=www.example.com, then the cookie is not visible for http://example.com

不可见

我已阅读有关 Rfc6265CookieProcessor 和 LegacyCookieProcessor 的讨论,但我不知道解决此问题的正确方法。

Springboot 2.2.6 使用tomcat版本9.0.*

那么,我该如何解决这个问题?

编辑:

我只是在本地主机上尝试上述更改,而不是在生产环境中。而不是访问 http://www.example.com, I was doing https://www.localhost and instead of accessing http://example.com, I was doing http://localhost

正确的值为:

server.servlet.session.cookie.domain=example.com

我正在尝试的是我在本地主机上进行更改,但它们对我不起作用。我正在手动修改 chrome 控制台中的值,并希望看到在域 localhost 的 https://localhost 上设置的 cookie 在域 https://www.localhost 的另一个选项卡中可见,但那没有发生。

我在这里阅读了答案:Share cookie between subdomain and domain 和@Cesc 对该答案的评论是:

I am not sure where to put this so I am choosing the comments of the accepted answer. It took long time and failed experiments to prove the above on my localhost, until it occurred to me that I should call the localhost with a dot in the name. Like "localhost.com" or something like that. Then all the "set cookies" behaviours started following the explanations written here in this answer. Hoping this might help somebody.

所以,我直接在生产中尝试了我的更改,它们运行良好。我仍然无法让它在本地主机上工作。我在本地主机上访问我的网站的方式是:

https://localhost 和 https://www.localhost。根据@Cesc 的评论,我可能需要通过 https://www.localhost.comhttps://[=35 访问本地主机上的网站=] 然后就可以了。但是,我没试过。

与其在您的开发机器上使用 'localhost' 进行测试,不如尝试使用您机器的完全限定主机名。我在针对我们的单点登录平台测试身份验证时遇到了类似的挑战。