解決cookie寫入問題


5.解決cookie寫入問題

接下來我們查看首頁cookie:

什么都沒有,為什么?

 

5.1.問題分析

我們在之前測試時,清晰的看到了響應頭中,有Set-Cookie屬性,為什么在這里卻什么都沒有?

我們之前在講cors跨域時,講到過跨域請求cookie生效的條件:

  • 服務的響應頭中需要攜帶Access-Control-Allow-Credentials並且為true。

  • 響應頭中的Access-Control-Allow-Origin一定不能為*,必須是指定的域名

  • 瀏覽器發起ajax需要指定withCredentials 為true

看看我們的服務端cors配置:


沒有任何問題。

再看客戶端瀏覽器的ajax配置,我們在js/common.js中對axios進行了統一配置:


一切OK。

那說明,問題一定出在響應的set-cookie頭中。我們再次仔細看看剛才的響應頭:

我們發現cookie的 domain屬性似乎不太對。

cookie也是有 的限制,一個網頁,只能操作當前域名下的cookie,但是現在我們看到的地址是0.0.1,而頁面是www.leyou.com,域名不匹配,cookie設置肯定失敗了!

 

5.2.跟蹤CookieUtils

我們去Debug跟蹤CookieUtils,看看到底是怎么回事:

我們發現內部有一個方法,用來獲取Domain:

它獲取domain是通過服務器的host來計算的,然而我們的地址竟然是:127.0.0.1:8087,因此后續的運算,最終得到的domain就變成了:

問題找到了:我們請求時的serverName明明是:api.leyou.com,現在卻被變成了:127.0.0.1,因此計算domain是錯誤的,從而導致cookie設置失敗!

 

5.3.解決host地址的變化

那么問題來了:為什么我們這里的請求serverName變成了:127.0.0.1:8087呢?

這里的server name其實就是請求的時的主機名:Host,之所以改變,有兩個原因:

  • 我們使用了nginx反向代理,當監聽到api.leyou.com的時候,會自動將請求轉發至127.0.0.1:10010,即Zuul。

  • 而后請求到達我們的網關Zuul,Zuul就會根據路徑匹配,我們的請求是/api/auth,根據規則被轉發到了 127.0.0.1:8087 ,即我們的授權中心。

我們首先去更改nginx配置,讓它不要修改我們的host:proxy_set_header Host $host;

把nginx進行reload:

nginx -s reload

 

這樣就解決了nginx這里的問題。但是Zuul還會有一次轉發,所以要去修改網關的配置(leyou-gateway工程):

 

重啟后,我們再次測試。

最后計算得到的domain:

完美!

 

2.5.4.再次測試

我們再次登錄,發現依然沒有cookie!!


怎么回事呢?

我們通過RestClient訪問下看看:

發現,響應頭中還是沒有set-cookie

這是怎么回事??

 

2.5.5.Zuul的敏感頭過濾

Zuul內部有默認的過濾器,會對請求和響應頭信息進行重組,過濾掉敏感的頭信息:

會發現,這里會通過一個屬性為SensitiveHeaders的屬性,來獲取敏感頭列表,然后添加到IgnoredHeaders中,這些頭信息就會被忽略。

而這個SensitiveHeaders的默認值就包含了set-cookie

解決方案有兩種:

全局設置:

  • zuul.sensitive-headers=

指定路由設置:

  • zuul.routes.<routeName>.sensitive-headers=

  • zuul.routes.<routeName>.custom-sensitive-headers=true

思路都是把敏感頭設置為null

 

2.5.6.最后的測試

再次重啟后測試:




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM