當我們在www.a.com這個域下用ajax提交一個請求到www.b.com這個域的時候,默認情況下,瀏覽器是不允許的,因為違反了瀏覽器的同源策略。解決方案可以參考筆者的這篇博文:http://www.cnblogs.com/anai/p/4227157.html
這里要討論的是跨域中遇到的另一個問題,就是當提交一個請求到www.b.com這個域時,后台嘗試在響應中綁定cookie信息,以告知瀏覽器去保存這個cookie,但是默認情況下,瀏覽器是不會去為你創建cookie的,具體現象就是你發現在響應中已經有set-cookie的響應頭了並且有值,而且瀏覽器也會有信息顯示已接收到cookie了,但是就是在cookie中找不到。沒錯,該現象就是因為你是跨域提交的創建cookie的請求。那么如果我們非要瀏覽器去創建這個cookie怎么辦呢?這里就要使用到一個xmlHttpRequest對象的屬性xhrFields,官方文檔的解釋如下:
A map of fieldName-fieldValue pairs to set on the native XHR
object. For example, you can use it to setwithCredentials
to true
for cross-domain requests if needed.
意思就是該屬性是一個用來配置xhr對象的鍵值對,比如你可以在跨域請求有需要的時候設置withCredentials:true
那么withCredentials:true是什么意思?
該屬性是告訴瀏覽器,1、允許創建來自不同域的cookie信息;2、每次的跨域請求都允許帶上該cookie信息
該配置項還需要后台的允許才有效,后台如果允許瀏覽器發送帶憑據的請求,那么會在響應頭中帶上"Access-Control-ALLOW-Credentials",值為"true"。
如果不加此響應頭,瀏覽器將獲取不到服務端的響應體。
好了,到此我們已經知道怎么跨域創建cookies,並在每次的跨域請求中帶上cookies了,簡單的說就是前台要配置一個ajax參數:xhrFields:{withCredentials:true},有的資料上說還要設置crossDomain:true,但是筆者測試好像不需要;后台要在響應頭中綁定"Access-Control-ALLOW-Credentials",值為"true"。