接下來我們查看首頁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.最后的測試
再次重啟后測試: