CORS是一個(gè)W3C標(biāo)準(zhǔn),全稱是"跨域資源共享"(Cross-origin resource sharing)。
它允許瀏覽器向跨源服務(wù)器發(fā)出XMLHttpRequest請求锭吨,從而克服了AJAX只能同源使用的限制初家。
對CORS協(xié)議不了解的同學(xué),可以猛擊這里坷牛。
今天我們來討論其中的cookie傳輸問題罕偎。
場景:
http://a.com/test.html向
http://b.com/test.php
發(fā)起ajax請求。
test.php種cookie name:ball
test.html第二次發(fā)起請求時(shí)漓帅,希望將cookie(name:ball)帶給test.php锨亏。
1. 實(shí)現(xiàn)
代碼如下:
a.com/test.html
<body>
<script src="/jquery.min.js"></script>
<script>
var url = "http://b.com/test.php";
$.ajax({
url:url,
type:"GET",
xhrFields:{
withCredentials:true
},
success:function(res){
console.log(res);
}
})
</script>
</body>
說明:
- withCredentials:true是關(guān)鍵。只有加上此選項(xiàng)忙干,瀏覽器才會允許跨域攜帶cookie器予。
b.com/test.php
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Origin: http://a.com");
if (count($_COOKIE)){
echo json_encode($_COOKIE);
}
else{
header("Set-Cookie:name=ball;path=/");
}
說明:
- Access-Control-Allow-Credentials: true
與瀏覽器側(cè)的withCredentials:true成對使用,表明服務(wù)端許可發(fā)cookie捐迫。
- Access-Control-Allow-Origin: http://a.com
表示服務(wù)端接收a.com的請求乾翔。如果請求時(shí)不需要帶cookie,此字段可以寫*施戴,表明該站接收所有來源的ajax請求反浓。如果需要傳輸cookie, 該字段只能寫一個(gè)固定來源。
訪問test.html赞哗,第二次時(shí)如愿在console里看到
{"name":"ball"}
這說明:
- b.com成功種下了cookie
- a.com成功在跨域ajax請求中帶上了cookie
2. 探討
2.1 test.php是將cookie是種到了a.com下還是b.com下呢雷则?
我們在a.com和b.com下分別添加
cookie.php
var_dump($_COOKIE);
執(zhí)行后發(fā)現(xiàn),a.com下的cookie.php輸出為空肪笋。cookie其實(shí)是種到了b.com下月劈。
2.2 服務(wù)端單方面種cookie是否會成功?
既然2.1中的結(jié)論是cookie種到了b.com下度迂,那么在發(fā)ajax請求時(shí)去掉
xhrFields:{
withCredentials:true
}
test.php是否能成功在b.com下種cookie呢?
修改代碼后執(zhí)行test.html,test.php在Response Headers中依然種了cookie猜揪,如下圖所示惭墓。
然后我們訪問
b.com/cookie.php
發(fā)現(xiàn)cookie并沒能如愿種下。
2.3 a.com能否把自己域下的cookie帶給b.com?
我們在a.com下事先種下cookie:name=x
訪問test.html, 如下圖所示
Resquest Headers中只帶了b.com下的name=ball而姐。并沒有發(fā)送a.com下的cookie
2.4 a.com/test.html會因此能讀到b.com下的cookie么腊凶?
我們訪問a.com/test.html, 然后打開控制臺。執(zhí)行document.cookie拴念,結(jié)果空空如野钧萍。
3. 總結(jié)
- A站向B站發(fā)起跨域ajax時(shí),只能攜帶B站下的cookie給B丈莺。
- B站只有在A站允許的情況下划煮,才能在跨域ajax中向自己的域下種cookie。
- 即使A,B站達(dá)成cookie傳輸協(xié)議缔俄,A站頁面也不會因此能拿到B站的cookie弛秋。