关于iframe下session丢失的问题

问题描述:

页面中通过Iframe嵌入了另外一个网页,但是嵌入的网页无法设置cookie,导致无法访问。仔细检查,在浏览Set-cookie的响应头出发现提示:This Set-Cookie didn’t specify a “SameSite” attribute and was defaulted to “SameSite=lax”, and was blocked because it came from a cross-site response which was not the response to a top-level navigation. …

原因:谷歌最新版的浏览器默认SameSite=Lax (该设置从2020 年7月14全面展开,具体见:https://www.chromestatus.com/feature/5088147346030592),如果设置SameSite=Lax , 并且嵌入Iframe的地址和iframe外的地址不是SameSite,那么嵌入iframe的地址将无法设置设置cookie。关于什么是SameSite,首先应该理解site,所谓Site就是域名后缀和其前面的第一部分,比如web.dev可以是一个Site,从而www.web.dev 和 static.web.dev 可以看成相同的Site。具体可以参考SameSite解释 或 https://tools.ietf.org/html/draft-ietf-httpbis-cookie-same-site-00 。

解决方法(提供三种作为参考):

在谷歌浏览器搜索 chrome://flags/#same-site-by-default-cookies chrome://flags/#cookies-without-same-site-must-be-secure 将这两项设置为Disabled,并重启浏览器。这种方法可以临时解决用户不能使用的问题。

采用一定方法将嵌入Iframe的地址配置成 Same Site ,比如使用nginx 代理。

在设置Cookie的响应头中添加 SameSite=None;Secure ,在Cookie响应头设置SameSite=None就可以替换谷歌浏览器的默认配置,而SameSite=None可以允许跨Site设置Cookie。一个完整的cookie响应头可以像这样: Set-Cookie: JSESSIONID=ACD341E8840C03003E4532921C21C035;Path=/begin01; SameSite=None; Secure ,至于怎么加响应头SameSite=None;Secure,可以考虑在nginx里设置,参考:https://blog.cat73.org/20170802/2017080201.nginx-cookie-sucure/,也可以在后台代码里设置,推荐nginx吧。这里注意一点 Secure 属性,这个属性说明设置的该cookie只能在https下传输,所以要求你使用https,不使用行吗,不行,因为SameSite=None 要求必须要和Secure=true一起使用。所以采用这个方法解决,你嵌入iframe的页面必须使用https。

原文:https://blog.csdn.net/ysyysjbama/article/details/108061969

你可能感兴趣的:(JAVA相关,java)