springboot跨域如何设置SameSite

前言

好久没有更新博客了, 我还是太懒了, 今天继续更新!

今天记录一个前段时间遇到的一个小问题的解决方法, 跨域!!!

相信跨域这个问题, 做开发的或多或少都遇到过, 而且已经有很多博主已经分享了相关的内容, 这次我用他们的方式都没有解决到, 所以记录一下.

问题

我们公司有个系统的域名跟主系统的域名不一致, 但是我们又需要把所有的系统都集成在一个框架下面, 使用的是iframe技术来实现. 使用单点登录来做所有系统的登录. 这样的设计就导致我们访问域名不同的系统的时候, 会有跨域的问题. 通常的解决方式这样, 在springboot里面设置跨域拦截器, 可以实现跨域访问.

springboot跨域如何设置SameSite

但是, 但是, 我们使用了这个配置之后, 依然无法实现登录, 最明显的一个问题就是每次请求的sessionid都不一样, 即使是同一个页面的多个请求, sessionid也不一样.这样我们就无法通过session来保留会话.

解决方法

经过老夫不懈的Google, 最开始定位到问题的原因是因为Google浏览器的SameSite属性导致的. Chrome 51 开始,浏览器的 Cookie 新增加了一个SameSite属性,用来防止 CSRF 攻击和用户追踪。这个属性有3个值, 具体的介绍可以看这篇文章 里面讲的很详细.

我们选择的是直接关闭这个属性,设置为None, 就像这样:

response.setHeader("Set-Cookie", "SameSite=None;Secure;JSESSIONID=xxx");

注意, 上面的代码有个坑

这样设置时候, 我们期望的是一个请求后, cookie里面能够设置JSESSIONID. 然而, 并没有达到我们的预期效果

在老夫的头发快抓完的时候, 在反反复复的阅读了上面的那篇文章之后, 老夫抱着尝试的心态改了一下上面的代码, 如下:

response.setHeader("Set-Cookie", "JSESSIONID=xxx;SameSite=None;Secure");

仔细看, 仅仅是JSESSIONID的位置改变了一下. 然后就成功了, 苍天啊~ 大地啊仅仅是一个位置啊~~~~~~

遂, 该篇水文完~

上一篇:新版Google浏览器跨域Cookie解决方案


下一篇:web前端技巧分享:一场由SameSite字段引发的悲剧