跨越(三)CORS中的Cookie

之前遇到过一个跨域的问题详情点击此处,在服务端配置Access-Control-Allow-Origin和Access-Control-Allow-Credentials,并且前端设置withCredentials 为true。同样的程序在本地计算机运行正常,但是将程序部署到服务器上异常。排查发现是因为浏览器默认不发送Cookie,导致虽然服务器set-cookie,并且前段保存这个cookie,但是在随后的请求中并没有将此cookie携带,服务端没收到cookie,一直认为是新登录,不停的转到登录界面。

但是为社么本地计算机启动时就可以呢?

Cookie翻译过来是饼干,小甜点,曲奇。它是浏览器存储小量信息到本地的一种方式。Http是无状态协议(是指协议对于事务处理没有记忆 能力上一次请求和下一次请求没有关联,HTTP不会记录这些),每一次的Http请求都是独立对等的,服务器不知道上一个访问的是谁,上一次访问干了社么。但是例如会话、登录状态等需要直到用户的状态,就需要一个东西来特征性的标识用户,让服务器直到这次访问和以前联系。Cookie、session、token等都是起这个标识作用。

Cookie就是用来绕开HTTP的无状态性的手段,它是Web的标准技术(是web标准而不局限于只是Servlet),隶属于RFC6265,现今的所有的浏览器、服务器均实现了此规范。

Cookie的属性:

Name和Value:Name和Value是一对键值对,Name是Cookie的名称,Value是该名称对应的Cookie的值。Cookie一旦创建,名称不可修改。

Domian(域):Domain决定Cookie在那个域是有效的,决定向某个域发送请求时是否携带Cookie,默认为请求地址。和同源策略的协议-域名-端口不同,Cookie的域只看域名,和协议端口无关,存取的Cookie只有在本域或子域下才能生效。Domian设置的时候不能设置为服务器所属之外的域。

例如访问三个网页,获得不同的Cookie
baidu.com:根域名 获得cookieA
test.baidu.com:子域名1 获得cookieB
apple.baidu.com:子域名2 获得cookieC
访问baidu.com时可以设置此域名的cookie,但是无法设置两个子域名的cookie。cookieA可以访问上面三个域名,但是cookieB无法访问子域名2,而cookieC无法访问子域名1。

Path:Path是Cookie的有效路径,和Domain类似,也对子路径生效。

Expires/Max-age:两个均为Cookie的有效期,Expires是Cookie被删除的时间点(服务器时间),格式为GMT,若设置为以前的时间则立刻删除。若不设置则默认页面关闭时删除该cookie。Max-age标识多少秒之后失效,默认值为-1。Expires是1.0就有的,Max-age是1.1才加上的,为了向下兼容浏览器显示Expires/Max-age,表示到期时间。

Max-age > 0 :cookie不仅存在内存里,还会持久化到硬盘,也叫持久cookie。即使会话关闭,这个cookie依旧存在,请求时依然会携带。

Max-age < 0:临时cookie,只存在于内存中,一旦关闭浏览器则cookie消失。使用无痕浏览也不携带此cookie。

Max-age=0:内存中没有,硬盘中也没有,当此值设置为0时,浏览器中存在的cookie让其立马失效。

Max-age比Expires方便,因为Expires是设置时间比较乱,而Max-age是在此后的多少秒。Expires设置的是服务器时间,当服务器时间和浏览器时间不同步时就会出错,而Max-age则不会。

Size:Cookie的大小,在所有浏览器中,任何cookie超过限制大小都会被忽略,且永远不会被设置。不同的浏览器对Cookie大小的限制不同。

HttpOnly:true或false,若设置为true,则不允许通过脚本document.cookie去设置cookie的值,同样在document.cookie也不可见,但是在请求的时候会发送。

Secure:cookie的安全属性,若设置为true,则浏览器只会在HTTPS和SSL等安全协议中传输此Cookie,不会在不安全的HTTP协议中传输此Cookie。

参考资料:https://blog.csdn.net/qq_39834073/article/details/107808959

第一方Cookie:由当前地址栏中的网址给cookie

第三方Cookie:页面中其他嵌入广告或者来源的cookie。

在使用默认Domain的情况下,也就是Domian的设置为访问的域名。 第一方cookie的域和当前访问域名相同,其他域和当前网址域名不用的都是第三方cookie。回到开头那个问题,静态页面启动在localhost:63342,当程序在本地运行的时候,域名是localhost,而运行在云服务器上域名为云服务的域名(xxx.xxx.xxx.xxx)。微软的Edge还有Google浏览器默认都是禁止第三方cookie的。所以在本地运行时,发送回来的属于第一方cookie,浏览器保存,而在云服务器运行,发送回来的属于第三方cookie,浏览器不保存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值