前言
好久沒有更新博客了, 我還是太懶了, 今天繼續更新!
今天記錄一個前段時間遇到的一個小問題的解決方法, 跨域!!!
相信跨域這個問題, 做開發的或多或少都遇到過, 而且已經有很多博主已經分享了相關的內容, 這次我用他們的方式都沒有解決到, 所以記錄一下.
問題
我們公司有個系統的域名跟主系統的域名不一致, 但是我們又需要把所有的系統都集成在一個框架下面, 使用的是iframe技術來實現. 使用單點登錄來做所有系統的登錄. 這樣的設計就導致我們訪問域名不同的系統的時候, 會有跨域的問題. 通常的解決方式這樣, 在springboot里面設置跨域攔截器, 可以實現跨域訪問.
但是, 但是, 我們使用了這個配置之后, 依然無法實現登錄, 最明顯的一個問題就是每次請求的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的位置改變了一下. 然后就成功了, 蒼天啊~ 大地啊僅僅是一個位置啊~~~~~~
遂, 該篇水文完~