本文参考了:https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials
概述
XMLHttpRequest.withCredentials不止控制着 browser-->server的request中 是否携带credentials信息,还控制着前端JavaScript如何使用 server-->browser的reponse中 的credentials信息。
这里的“credentials”是指下面三种信息
1. cookies
2. authorization headers
3. TLS client certificates
下面,我们以cookie为例,分各种情况看下XMLHttpRequest.withCredentials的具体作用
XMLHttpRequest 不跨域 时
XMLHttpRequest.withCredentials的值没有任何作用。
XMLHttpRequest 跨域 时
// 注意:当前位于domain1上,我们跨域请求domain2的资源
var org = {"p1":201989,"p2":17888889999};
$.ajax(
{
url:'http://domain2/wechatpack/test/hi',
type:'post',
dateType:'json',
headers:{'Accept': 'application/json, text/javascript, */*; q=0.01'},
crossDomain: true,
xhrFields: {
withCredentials: true
},
data:JSON.stringify(org),
success:function(data){console.log("sucess");},
error:function(data){console.log("error");}
}
);
上面代码,当前在domain1上,发送跨域请求XMLHttpRequest xhr请求domain2的资源,并得到响应rsp,则:
无论xhr.withCredentials是什么值
- xhr永远不携带 domain1的cookie。
- rsp永远无法设置 domain1的cookie。
xhr.withCredentials==false时(默认)
- xhr中不携带 domain2的cookie(即不携带所请求的域的cookie)。
- rsp无法设置 domain2的cookie。
xhr.withCredentials==true时
- xhr中携带了 domain2的cookie(即携带了所请求的域的cookie)。
- rsp可以设置 domain2的cookie。
- domain2的cookie,包括返回的rsp中所设置的 domain2的cookie,以及browser已经设置给 domain2的cookie,依然遵循同源策略。也就是说:
- 前端JavaScript代码(注意:当前位于domain1上)无法访问返回的rsp中所设置的 domain2的cookie。
- 前端JavaScript代码(注意:当前位于domain1上)无法通过document.cookie访问到已经设置给 domain2的cookie。
完
3452

被折叠的 条评论
为什么被折叠?



