跨域ajax请求如何携带cookie

A站点:www.a.com
B站点:www.b.com

当在A站点向B站点发起ajax请求时,
1、如果B站点的响应头里没有Access-Control-Allow-Origin: http://www.a.com(或者Access-Control-Allow-Origin: *),跨域请求是会失败的;
2、如果B站点的响应头里有Access-Control-Allow-Origin: * | http://www.a.com,那么跨域请求会成功,但是该请求不会携带B站点所在域的cookie( 如果该请求不是ajax请求,而是img、script、iframe标签等发起的请求,那么该请求会携带B站点所在域的cookie,跟没跨域直接访问B站点对应的资源一样 );
3、如果该ajax请求的xhr.withCredentials = true,且B站点的响应头包含Access-Control-Allow-Credentials: true  Access-Control-Allow-Origin: http://www.a.com( 注意这里不能用泛型Access-Control-Allow-Origin: * ),那么该ajax请求跟img、script、iframe标签等发起的请求一样,会携带B站点所在域的cookie;如果B站点的响应头里设置了cookie(如Set-Cookie: "name=tobi; Path=/mme=yy; Path=/",设置了name=tobi,mme=yy两个cookie),该cookie的domain是B站点的域名,而不是A站点的域名,同样也遵循同源策略,即B站点可以获取该cookie而A站点是无法获取的。

有两个Http头部和Cookie有关:Set-Cookie和Cookie。
    Set-Cookie由服务器发送,它包含在响应请求的头部中。它用于在客户端创建一个Cookie
    Cookie头由客户端发送,包含在HTTP请求的头部中。注意,只有cookie的domain和path与请求的URL匹配才会发送这个cookie。

对于GET跨域请求,浏览器不会发送一个“预请求”(OPTIONS请求)。但是,如果服务器端的响应中,如果没有返回Access-Control-Allow-Origin:* | 指定站点  的响应头,那么浏览器将不会把响应结果传递给发出请求的脚本程序,以保证信息的安全。

注意:对于以上A站点向B站点发起ajax请求的情况,以前我一直误认为Access-Control-Allow-Credentials:true是让请求携带A站点的cookie发送到B站点服务器,其实是让请求携带B站点的cookie发送到B站点服务器。

你可能感兴趣的:(跨域ajax请求如何携带cookie)