深入理解cookie

 我来答
科创17
2022-06-26 · TA获得超过5876个赞
知道小有建树答主
回答量:2846
采纳率:100%
帮助的人:171万
展开全部
看个实际生活的例子:

学校门口有家饭店味道不错,小明去吃了一次,确实味道不错,这周小明又去这家饭店吃饭,结账时,小明说:”我上周来过,这是第二次了,能不能打个折?“。老板说:”你来过?我不记得啊(无状态)“。小明表示很生气,明明来过老板竟然不记得。老板想了个法子,给小明发了张卡片(cookie),上面写着小明的信息,下次小明拿着卡片来老板就认识了。

回到正题,cookie用在http请求中,而http是无状态协议,它的每个请求都是完全独立的,服务端无法判别用户状态,cookie用来告诉服务端用户的状态信息。客户端用户第一次发送请求给服务端时,服务端在返回的响应中发给用户一个cookie,里面记录了用户的信息,下次用户再发送http请求给服务端时,会携带上cookie,服务端检查cookie获取用户的状态信息。

cookie的内容主要是服务端写入的,由客户端存储在本地,cookie其实是以字符串的形式存储的。打开谷歌开发者工具的Application中的Cookie,可以看到cookie具有以下字段

cookie以键值对的形式存储用户数据

不同域名是无法操作彼此cookie的,而且必须满足path一样或者是其子路径才能相互访问彼此的cookie。

domain用来设置可以使用cookie的域名,如果想让一级域名下的两个二级域名都能使用cookie,例如imag.baidu.com和www.baidu.com,可以设置domain为baidu.com,但不能设置为.com,这样两个二级域名都能使用。path属性设置允许使用cookie的路径,例如设置为根路径"/",表示允许根路径以及根路径下的所有子路径都可以使用cookie

所以domain和path共同决定了cookie能否被浏览器自动添加到请求头部中发送出去。如果没有设置这两个选项,则会使用默认值。domain的默认值为设置该cookie的网页所在的域名,path默认值为设置该cookie的网页所在的目录。

此外,如果是跨域请求,例如XMLHttpRequest请求,默认是不会自动携带cookie的。

cookie的过期时间,Expires是具体日期,Max-Age是一段时间

cookie的大小,一般是4k,此外cookie的个数也有限制,不同浏览器cookie的个数限制不同

该cookie数据是否只用来在http请求中传递,默认为false,如果设置该字段为true,客户端无法用js访问或者操作该cookie,这条cookie信息不会出现在document.cookie的字符串中。

默认为false,设置该字段为true则该cookie不会携带在http协议的请求中,只能携带在安全的https协议请求中

当网页要发http请求时,浏览器会先检查是否有相应的cookie,有则自动添加在request header中的cookie字段中。这些是浏览器自动帮我们做的,而且每一次http请求浏览器都会自动帮我们做。这个特点很重要,因为这关系到“什么样的数据适合存储在cookie中”。

因为每次浏览器发送http请求都会自动携带cookie,会增加网络开销,所以最好只存放每次请求都需要发送给服务端的数据,比如身份认证信息。

客户端使用js设置 cookie,客户端可以设置cookie 的下列选项:expires、domain、path、secure(有条件:只有在https协议的网页中,客户端设置secure类型的 cookie 才能成功),但无法设置HttpOnly选项。document.cookie可以获取cookie字符串,也可以设置cookie。

document.cookie="age=12; expires=Thu, 26 Feb 2116 11:50:25 GMT; domain=sankuai.com; path=/";

值得注意的是,浏览器提交Cookie时只会提交name和value属性,maxAge属性只被浏览器用来判断Cookie是否过期。

当要设置多个cookie时,必须重复设置document.cookie = "key=name"。

要想修改一个cookie,只需要重新赋值就行,旧的值会被新的值覆盖。但要注意一点,在设置新cookie时,path/domain这几个选项一定要旧cookie 保持一样。否则不会修改旧值,而是添加了一个新的 cookie。删除一个cookie 也挺简单,也是重新赋值,只要将这个新cookie的expires 选项设置为一个过去的时间点就行了。但要注意,path/domain/这几个选项一定要旧cookie 保持一致。

服务端的response header中有一项叫set-cookie,是服务端专门用来设置cookie的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Storm代理
2023-07-25 广告
StormProxies是一家可靠的代理服务提供商,提供原生IP(住宅原生IP)和高匿名代理服务。以下是关于StormProxies的原生IP服务的一些信息:1. 住宅原生IP:StormProxies提供的住宅原生IP是指从真实的家庭或企... 点击进入详情页
本回答由Storm代理提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式