cookie搞懂(你可能不知道的cookie)
cookie搞懂(你可能不知道的cookie)
2024-09-30 02:02:02  作者:踏碎了树荫  网址:https://m.xinb2b.cn/know/aiz135558.html
大家都了解的cookie

很多前端面试题都会考察cookie 大家一般都能答上的几个点:

不能跨域存储空间有限,4KB通过document.cookieAPI进行get和setcookie与其他本地存储的区别大小不同,cookie是最小的。数量受限,每个域名下的cookie数量最多为20个(但很多浏览器厂商在具体实现时支持大于20个)某个域下的cookie会自动随该域下的请求带在request header的cookie字段里。可以设定过期时间。可以设定path,而其他存储往往只有域的限制。存在httpOnly属性,只能由服务端设置,JS无法设置和获取。可以设置secure属性,当设置为true时,只能在HTTPS连接中被浏览器传递到服务器端进行会话验证,如果是HTTP,连接则不会传递该信息,所以不会被窃取到Cookie的具体内容。可以通过浏览器的清除历史功能清除用户可以禁用cookiecookie的应用场景cookie最大的特点是自动随该域下的请求带在request header的cookie字段里,而无需额外的JS操作,在做通用的登录认证系统的时候有着天然的优势。cookie有httpOnly属性,可以防止XSS攻击,安全性比其他存储更有保障。服务端在控制页面跳转的时候可以不通过JS方便的进行少量值的传递,控制页面的展示。静态资源CDN之所以放在非主域名下,很大一部分原因在于可以无需携带相关cookie,减少流量损耗。cookie的属性


cookie的增删改查

服务端和JS端都可以对cookie进行增删改查, cookie中不得包含任何逗号、分号或空格,(可以用encodeURIComponent()来保证).

服务端设置cookie

服务端通过在请求的response header中携带Set-Cookie字段对cookie进行设置, 格式与用JS设置cookie是相同的,都采用;进行属性分隔. 例如:

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly

JS设置cookie

JS设置domain: 默认值为当前域, n级域名可以设置 小于n级域名的domain. 例如: 在www.baidu.com域下 可以将domain设置为 baidu.com, 但是不能设置为a.www.baidu.com, 也不能设置为tieba.baidu.com,更不能设置为sina.com.

JS设置path: 默认为/, path的设置不受限制, 比如我可以在im.baidu.com/todo下将cookie的path设置为/search

JS对于secure属性,无论get还是set ,必须在https下,

JS不能设置httponly属性,

删除cookie: 指定key, domain, path 必须与想要删掉的cookie一模一样, 然后将expires的值设为一个过期值,即可删除.

修改cookie: 指定key, domain, path 必须与想要修改的cookie一模一样, 否则将创建一个不同的cookie,然后设置想要更新的value或expires值.

var cookie = { getCookie: function (key) { return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" encodeURIComponent(key).replace(/[\-\.\ \*]/g, "\\$&") "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null; }, setCookie: function (opts) { if (Object.prototype.toString.call(opts) !== "[object Object]") { return; } if (!opts.key) { return; } if (!opts.value) { opts.value = ''; } var tmp = opts.key '=' encodeURIComponent(opts.value) ';'; if (opts.expires) { tmp = 'expires=' new Date(new Date().getTime() opts.expires * 1000).toGMTString() ';'; } if (opts.path) { tmp = ('path=' opts.path ';'); } if (opts.domain) { tmp = ('domain=' opts.domain ';'); } if (opts.secure) { tmp = 'secure' } document.cookie = tmp; }, delCookie: function (opts) { cookie.setCookie({ key: opts.key, value: '', expired: -1000000000, path: opts.path, domain: opts.domain, }) }, }

其他

判断是否启用cookie

使用navigator.cookieEnabled可以判断用户是否启用cookie

if (!navigator.cookieEnabled) { // 让用户知道,开启网页中的cookies是很有必要的.}

是否可以直接修改header中的cookie字段?

Ajax请求可以设置header,但是某些header字段无法设置,比如refer, cookie等.

cookie自动删除

cookie 会被浏览器自动删除,通常存在以下几种原因:

会话 cooke (Session cookie) 在会话结束时(浏览器关闭)会被删除持久化 cookie(Persistent cookie)在到达失效日期时会被删除如果浏览器中的 cookie 数量达到限制,那么 cookie 会被删除以为新建的 cookie 创建空间。

CORS请求携带cookie

CORS请求默认不发送Cookie和HTTP认证信息。如果要把Cookie发到服务器,一方面要服务器同意,指定Access-Control-Allow-Credentials字段。

Access-Control-Allow-Credentials: true

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

var xhr = new XMLHttpRequest();xhr.withCredentials = true;

否则,即使服务器同意发送Cookie,浏览器也不会发送。或者,服务器要求设置Cookie,浏览器也不会处理。

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

希望本文能帮助到您!

点赞 转发,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓-_-)

关注 {我},享受文章首发体验!

每周重点攻克一个前端技术难点。更多精彩前端内容私信 我 回复“教程”

原文链接:http://eux.baidu.com/blog/fe/你可能不知道的cookie

作者:谢郁

  • 初三课文变色龙读后感(全民阅读推进月)
  • 2024-09-30全民阅读推进月作者:安东·巴甫洛维奇·契诃夫(1860年1月17日-1904年7月15日)俄国小说家、戏剧家、十九世纪俄国批判现实主义作家、短篇小说艺术大师〔1〕契诃夫,1860年1月29日生于罗斯托夫省塔甘罗格市。
  • 现代汽车第十代索纳塔(试驾北京现代第十代索纳塔)
  • 2024-09-30试驾北京现代第十代索纳塔无论在怎样文化语境中,从跌落神坛到卷土重来的桥段总是故事中最为引人注目的部分,而这样的道理放到汽车圈也是一样近十年前,八代索纳塔一经亮相便在全球范围内斩获颇多,一时间成为了销量榜头部的常客只不过,随着。
  • 香菇炒肉片简单又好吃(香菇肉片这样炒)
  • 2024-09-30香菇肉片这样炒肉类是我们日常饮食中不可缺少的一部分,很多人都很喜欢吃肉虽然现在肉价比较高,但是依然不能阻挡吃货们对吃肉的执著肉的食用方法有很多,可红烧,清炖,做成馅料,或者是直接和各种蔬菜一起炒,可以说,只要有肉,。
  • 生育险报销是在怀孕初期还是后期(搞懂生育保险那些事)
  • 2024-09-30搞懂生育保险那些事点击蓝字关注我们大家好,这里是本立社保君频道国家的三胎政策都出来了你还搞不懂生育保险?要知道在生孩子难、养孩子更难产前检查、住院生娃等等哪一样不要钱?月嫂、奶粉、尿不湿等等哪一样不烧钱?如果这时候,你。
  • 脾胃虚弱了怎么去补脾胃(脾胃虚弱怎么办)
  • 2024-09-30脾胃虚弱怎么办很多人应该知道脾胃对于身体来说是非常重要的,脾胃虚弱就很容易让身体的消化系统以及其他地方跟着发生问题,容易让身体发生各种疾病因此对于脾胃是要格外重视的,而如果发现自己身体这个部位经常有出汗的现象要警惕。
  • 世界上最懒的鱼(关于世界上最懒的鱼)
  • 2024-09-30关于世界上最懒的鱼吸盘鱼,又名鮣鱼、粘船鱼、印头鱼,喜欢吸附在鲨鱼,海龟等大型海洋生物身上,外号“天生旅行家”,是世界上最懒的鱼它的头上长了一个鞋底一样的吸盘结构,它们利用这个吸盘吸附在某一个物体身上,然后挤出吸盘中的。
  • 女生右手戴戒指的不同含义(女生戴戒指的含义)
  • 2024-09-30女生戴戒指的含义戒指作为一个非常重要的饰品,有着许多浪漫的寓意,女生佩戴戒指不仅仅是有装饰的作用,还可以提升整个人的气质和魅力不过对于现在很多女生来说,一开始都不是很了解戴戒指的含义,都是随意佩戴在自己认为舒适的手指。
  • 论27岁考研的心酸日常(真实的读研生活)
  • 2024-09-30真实的读研生活文/学个习都说“考研最快乐的日子只有两天”一天是收到研究生录取通知书的那天;一天是研究生毕业的那天对此,个人也深有体会备考研究生的日子很苦,但是,大家都在咬牙坚持着,主要动力来源于对研究生生活的憧憬但。
  • 正宗唇齿留香酱焖小杂鱼(风味家常菜醋烹小杂鱼)
  • 2024-09-30风味家常菜醋烹小杂鱼为生活添色彩,给家庭增乐趣,我是热爱美食,热爱生活的万家灯火张家人,很高兴每天为大家分享美食的一些制作方法和心得,希望能够帮到大家,并且期待大家的点赞,评论,转发和关注——在我们内陆地区,少见新鲜的海。
  • 考驾照不到一年能开车吗(考驾照的时候可以开车吗)
  • 2024-09-30考驾照的时候可以开车吗相信有很多考驾照的小伙伴有同样的一个问题,考驾照可以开车吗?已经考到科目四了这样可不可以去开车?千万不要犯迷糊,考驾照的同时是不可以开车的必须考完驾照才可以上路首先从属性来说,这本身就是无证驾驶交警有。
  • 斗鱼五五开黑集结令(斗鱼主播大官人发布五五开露脸称发现阴谋)
  • 2024-09-30斗鱼主播大官人发布五五开露脸称发现阴谋当初的伞兵团现在失去了主心骨人物卢姥爷以后就基本解散了,三位伞兵中可能伞兵三号大官人的名气是最小的,但是他曾不止一次公开表示支持卢姥爷,即使是在五五开被锤开挂,被封杀之后有意思的是解放大官人在卢姥爷凉。
  • 天龙怀旧宣传词句(天龙记者站十三周年庆)
  • 2024-09-30天龙记者站十三周年庆它来了大家心心念念的周年庆大更新终于要来了哦!具体更新的内容详情,下面由我们一起来揭晓吧~一、全新外观1,时装:红泪多水仙欲上鲤鱼去,一夜芙蕖红泪多首款加入水袖技术新时装,周年华裳再现国韵之美经典的黑。