我是靠谱客的博主 神勇石头,最近开发中收集的这篇文章主要介绍Cookie的跨域问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

小小Cookie,大大能量

cookie,这个仅有4kb的小曲奇也是有大体量。朋友的项目遇到了问题,原因是在线上环境设置cookie发送请求,请求头中的Cookie属性带着所设置的cookie,但是在本地调试的时候却发现并不携带。

什么是cookie

详情请看这里

cookie属性

属性名描述
nameCookie的名称,Cookie一旦创建,名称便不可更改
valueCookie的值,如果值为Unicode字符,需要为字符编码。如果为二进制数据,则需要使用BASE64编码
maxAgeCookie失效的时间,单位秒。如果为整数,则该Cookie在maxAge秒后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为-1。
secure该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false。
pathCookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”。
domain可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”。
comment该Cookie的用处说明,浏览器显示Cookie信息的时候显示该说明。
versionCookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC 2109规范

所以你想设置cookie可以这样设置

//打开浏览器控制台,输入以下代码回车
document.cookie = "test=123;path=/;domain=blog.csdn.net"
//这样按住F12打开控制台,在Application的Cookies里面你就会找到刚才设置的属性

CookieDomain

刚才我们设置了test=123,我们会发现他的Domain.blog.csdn.net,然后现在切换到其他网页(如百度),再次打开控制台的Application之后会发现,我去竟然没有了。于是你会联想到cookie是不是也有跨域的问题?

答案是肯定的,而造成这一影响的原因之一是Domain

前端开发时,在登录页面发送请求,后端收到请求之后在set-cookie中设置cookie信息,其中就包括了Domain。如果前端在发送其他请求时,打开携带cookie的配置(如axiosaxios.defaults.withCredentials= true)则会带上跟后端同域名的cookie

下表为set-cookie的属性

name=value赋予 Cookie 的名称和其值(必需项)
expires=DATECookie 的有效期(若不明确指定则默认为浏览器关闭前为止)
path=PATH将服务器上的文件目录作为Cookie的适用对象(若不指定则默 认为文档所在的文件目录)
domain=域名作为 Cookie 适用对象的域名 (若不指定则默认为创建 Cookie 的服务器的域名)
Secure仅在 HTTPS 安全通信时才会发送 Cookie
HttpOnly加以限制, 使 Cookie 不能被 JavaScript 脚本访问

以上解释了为什么盆友的项目在线上设置cookie发送请求携带,而在本地开发不携带cookie的原因(线上设置的cookiedomain与后端同名,本地设置的则为localhost

刚才说原因之一,那其他的呢?拿一个post请求来说,http://aaa.www.com/xxxxx/list

如果满足下面几个条件才会携带cookie

  1. 浏览器端某个Cookie的domain字段等于aaa.www.com或者www.com。

  2. 都是http或者https,或者不同的情况下Secure属性为false。

  3. 要发送请求的路径,即上面的xxxxx跟浏览器端Cookie的path属性必须一致,或者是浏览器端Cookie的path的子目录,比如浏览器端Cookie的path为/test,那么xxxxxxx必须为/test或者/test/xxxx等子目录。

其他

  • 大家看见那个在ApplicationDomain的域名会被加.这是强制加的。

  • 为什么我朋友不能通过设置cookie来携带cookie

    • 如果只设置cookiedomain默认为当前域名。
    • 如果设置了domian,因为本地启动的是localhost所以domain设置他们后端的域名会写入不成功。

    写入cookie方法

    function setCookie(name, value, day, path, domain)
    {
    	day = day || 30;
    	path = path || '/';
    	var str = name + '=' + value + '; ';
    	if(day) str += 'expires=' + new Date(Date.now() + day * 24 * 3600 * 1000).toGMTString() + '; ';
    	if(path) str += 'path=' + path + '; ';
    	if(domain) str += 'domain=' + domain;
    	document.cookie = str;
    },
    

    当前域名为:blog.xiaoming.com 执行以下代码

    xei.setCookie('test1', 'abcd', 30, '/'); // 成功,默认写入当前域名
    xei.setCookie('test2', 'abcd', 30, '/', 'blog.xiaoming.com'); // 成功,前面追加一个“.”
    xei.setCookie('test3', 'abcd', 30, '/', 'abcd.xiaoming.com'); // 写入不成功
    xei.setCookie('test4', 'abcd', 30, '/', '.xiaoming.com'); // 成功
    xei.setCookie('test5', 'abcd', 30, '/', 'xiaoming.com'); // 成功,前面追加一个“.”
    xei.setCookie('test6', 'abcd', 30, '/', 'www.qq.com'); // 写入不成功
    
    • 不传domain,默认当前域名;
    • 只要传了domain,则会强制在前面加上一个.,不管是一级还是二级域名;
    • domain只能“小于等于”当前域名,否则写入不成功;

参考文献

  • 关于前后端写入Cookie时domain的一个问题
  • cookie的domain属性

最后

以上就是神勇石头为你收集整理的Cookie的跨域问题的全部内容,希望文章能够帮你解决Cookie的跨域问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部