跨域传递cookie

来源:互联网 发布:mac 应用程序图标 编辑:程序博客网 时间:2024/06/06 03:38

首先,需要在服务端返回的头部信息中增加:
 response.setHeader(“Access-Control-Allow-Origin”,”http://b.test.com“);
  
CORS请求默认不发送Cookie和HTTP认证信息。如果要把Cookie发到服务器,一方面要服务器同意,指定Access-Control-Allow-Credentials字段。

Access-Control-Allow-Credentials: true

另一方面,开发者必须在AJAX请求中打开withCredentials属性。

js:var xhr = new XMLHttpRequest();xhr.withCredentials = true;jq: document.cookie=“pin=test;domain=test.com;”;    $.ajax({       url:_url,       type:"get",       data:"",        dataType:"json",       xhrFields: {          withCredentials: true       },       crossDomain: true,

否则,即使服务器同意发送Cookie,浏览器也不会发送。或者,服务器要求设置Cookie,浏览器也不会处理。
  需要注意的是,如果要发送Cookie,Access-Control-Allow-Origin就不能设为星号,必须指定明确的、与请求网页一致的域名。同时,Cookie依然遵循同源政策,只有用服务器域名设置的Cookie才会上传,其他域名的Cookie并不会上传,且(跨源)原网页代码中的document.cookie也无法读取服务器域名下的Cookie。

  这里纠正一个误区,不是设置了cookie的domain参数,cookie就可以被跨域传输的。 其实,cookie的domain属性所说的跨域,确切地说,应该是跨子域(subdomain)。比如我在bbs.readlog.cn这个子域(这里是二级域名)下设置的cookie,如果不特别的设置domain属性,那这个cookie就只能被bbs.readlog.cn这个子域下的程序读到,至于www.readlog.cn是无法读取到这个cookie的,而我如果在bbs.readlog.cn设置cookie的时候,设置cookie的domain属性为readlog.cn,那么所有的子域就都可以读到这个cookie了。 其实仔细想一下,也会知道所谓跨域A.com去读取B.com的cookie仅仅通过cookie的domain属性是行不通的,如果这样是可以的,那无疑是一个巨大的安全隐患。

关于cookie的domain属性详解:
1. 在任何域名下,cookie的domain参数都只能指定为当前域名或上级域名(包括上级的上级,等等),此外都是无效的。
如:在t.a.b.com下,指定domain为t.a.b.com、a.b.com、b.com都是可行的。
2. 在domain的参数前,是否存在符号“.”是完全相同的。
如:domain=a.b.com和domain=.a.b.com是完全相同的。
3. 脚本只可访问domain参数设置为当前域名或上级域名(包括上级的上级,等等)的cookie,以及当前域名下设置的没有domain参数的
cookie。
4. 如果不指定domain,则cookie无法在其他任何域名下被访问,即使是子域名。
5. 指定domain与不指定domain的cookie是不相同的,即使下面的情况所产生的cookie也是不同的:
case1:在a.b.com下,设置无domain参数的cookie。
case2:在a.b.com下,设置domain=a.b.com的cookie。
case1和case2所生成的cookie是完全不同的。

原创粉丝点击