昨天跟前端联调接口,发现种在根域的cookie无法通过ajax请求带上来。很诧异,今天做了个实验。代码如下:
<!-- file: index.html --> <!-- 绑定host:127.0.0.1 cookie.com a.cookie.com b.cookie.com a.a.cookie.com b.b.cookie.com --> <!-- 开启web服务器: php -S 127.0.0.1:80 --> <!-- 打开cookie.com种cookie:document.cookie = "a=1; domain=.cookie.com"; --> <!-- 打开:http://cookie.com http://a.cookie.com http://b.cookie.com http://a.a.cookie.com http://b.b.cookie.com --> <img src="http://a.cookie.com/a.png"> <img src="http://b.cookie.com/b.png"> <img src="http://a.a.cookie.com/a.a.png"> <img src="http://b.b.cookie.com/b.b.png"> <script type="text/javascript" src="http://a.cookie.com/a.js"></script> <script type="text/javascript" src="http://b.cookie.com/b.js"></script> <script type="text/javascript" src="http://a.a.cookie.com/a.a.js"></script> <script type="text/javascript" src="http://b.b.cookie.com/b.b.js"></script> <script src="https://cdn.bootcss.com/jquery/3.1.0/jquery.js"></script> <script> $.get('http://cookie.com'); $.get('http://a.cookie.com'); $.get('http://b.cookie.com'); $.get('http://a.a.cookie.com'); $.get('http://b.b.cookie.com'); $.getJSON('http://cookie.com?callback=?'); $.getJSON('http://a.cookie.com?callback=?'); $.getJSON('http://b.cookie.com?callback=?'); $.getJSON('http://a.a.cookie.com?callback=?'); $.getJSON('http://b.b.cookie.com?callback=?'); </script>
以往印象:cookie的domain属性决定了它在哪些请求中生效(携带),如果种在根域下的cookie,请求所有子域资源均带此cookie。
实验结论:请求png、js均带上了cookie;get请求只有当前域带上了cookie;getJSON请求均带上了cookie。
ajax请求如果跨域了,是不安全的,所以就不带cookie了。就算服务端响应头包含了允许跨域的头,也不会带上cookie(是先发的请求,后响应的,想想都知道跟这个没关系,当然,再次请求依旧不会带)。
而getJSON请求为何会带上cookie呢?本质上getJSON就是加载js资源。。。
Ps:实践出真知
《“cookie作用域”》 有 1 条评论
当然,解决方案自然也是有的。
一种思路:p3p
另一种思路:全jsonp,服务端做referer校验
各有优缺点~自行体会~