在浏览器端,虽然以LocalStorage为代表的本地持久化方案已经非常成熟,但cookie因其可跨三级及以上域名、可后端参与操作等特性,在涉及用户验证等诸多业务中依然被广泛运用。

Cookie规格

Cookie的基本组成主要由4部分组成:

  • Key => Value 存储数据
  • Path 作用路径
  • Domain 作用域
  • Expires 过期时间,或者叫生命周期

我们可以用谷歌控制台体会一下。

打开suning.com,然后在控制台输入以下代码:

document.cookie = `my_data=123; expires=${new Date(2021,0,1).toGMTString()};`
复制代码

然后进入Application->Cookie->https://www.suning.com,可以看到my_data已经被写入列表。

在上面的例子中,我们并没有指定PathDomain两个值,所以浏览器给出了默认值:

  • Path=/ 作用于根及以下分支目录
  • Domain=www.suning.com 作用于该域

如果希望Cookie在三级及以上域名作用,可简单加一条:

document.cookie = `my_data=123; domain=suning.com; expires=${new Date(2021,0,1).toGMTString()};`
复制代码

可以看到,Cookie中增加了一条my_data记录domain=.suning.com。这里的.suning.com可以理解*.suning.com

关于Path项及其他Cookie项,这里就不多做解释了,大家可以自行尝试或者查询资料,在控制台里尽情虐待浏览器的cookie。

这里有几个小的经验追加一下:

  1. 日期格式非常松散。GMT时间格式是Cookie的标准时间格式,但其他时间格式谷歌浏览器也可以识别,这个方面大家可以自己探索一下,就不赘述了。因为单纯是日期格式问题,就可以写好多字。
  2. Expires时间是UTC时间。
  3. 浏览器的document.cookie虽然是以字符串形式赋值与取值,但其背后的管理机制却是类似Map类型。
  4. Cookie的销毁,是通过设置expires为一个过去时,但需要注意其domain path等需要对应。比如:
document.cookie = `my_data=123; domain=suning.com; expires=${new Date(0).toGMTString()};`
复制代码

后端Set-Cookie

后端往前端塞cookie是一种常用操作,方法是在响应头中设置set-cookie。浏览器会接收这个头部,并原样设置到本地cookie中。

Set-Cookie: <name>=<value>[; <name>=<value>]...[; expires=<date>][; domain=<domain_name>][; path=<some_path>][; secure][; httponly]
复制代码

这个格式看起来是不是与刚才设置document.cookie一致?补充最后两项说明:

  • secure表示cookie只能被发送到http服务器。
  • httponly表示cookie不能被客户端脚本获取到。

关于HTTP响应头,这里提两个注意事项:

  1. 头部的KEY可以重复多个。也就是说,头部是有可能出现多个set-cookie的。之前我曾遇到这样一个案例:后端工程师使用NodeJS+KOA做服务,对允许跨域的请求设置了头部Access-Control-Allow-Origin: *。当服务使用Docker部署后,运维的同学对前置的Nginx也配置了Access-Control-Allow-Origin,所以前端拿到的响应头中出现两个Access-Control-Allow-Origin。结果浏览器判定此项头配置无效,造成跨域请求失败。当然,set-cookie出现多个没有问题,只是此种情况需要做适配处理。
  2. 头部的KEY大小写不敏感。但这不代表处理头部的应用会大小写不敏感。

Cookie与encodeURI

关于URI/URL/URN

  • URI: Uniform Resource Identifier
  • URL: Uniform Resource Locator
  • URN: Uniform Resource Name

在进行web访问时,一个web地址(URL)由protocol+domain+path组成。

  • protocol: http/https/ftp 等等
  • domain: 类似www.suning.com
  • path: /aaa/b/cc/d.html 酱婶儿的 这样就形成了对一个网络资源的有效定位,也就是一个Locator。而这个URL实际上在全网范围也是一个唯一标识,所以也是一个URI。简单点说,URL是URI的一种。

URN我没有遇到(意识到?)典型的场景,按RFC来讲同样是URI的一个子集。

关于encodeURI与encodeURIComponent

这两者的区别在于对URI转义的字符集不同。encodeURI并不会对一个URI的分割标记做出转移,比如://#()?&=...,等等。

encodeURIComponent望文生义的话,是对URI部分的转义,意图是被转义的部分不影响URL的解析,那么就必须将其中的URI定义的字符全部转义。例子:

window.location.href = `https://auth.suning.com?redir=${encodeURIComponent('https://www.suning.com')}`;
// https://auth.suning.com?redir=https%3A%2F%2Fwww.suning.com
window.location.href = `${encodeURI('https://www.suning.com/prod.do?location=北京')}`;
// https://www.suning.com/prod.do?location=%E5%8C%97%E4%BA%AC
复制代码

最终的目的,是在不破坏URI的前提下,完整传递参数。

encodeURI在Cookie操作中的应用

我们获取cookie的途径,不仅是响应头的set-cookie。也许是localStorage数据,也许是一次API请求。

由于HTTP规范中,头中只允许使用ASCII字符,所以在向请求头塞cookie的时候,需要对cookie来源的字符串做预处理。这时候,就用到了encodeURI/encodeURIComponent。由于在GMT时间格式中存在URI的敏感字,也就是说,被encodeURI的忽略的字符集,小于header允许的字符集。所以一次性encode并不可取,需在cookie拼接完成后,做全量分析和处理。

Cookie字符串的切割与分析

如文章开头所说,为了兼容、复用一些老的登录框架,往往需要用到cookie处理机制。由于前端AJAX无法处理302请求问题,也就无法处理写cookie跳转的登录行为,所以你可能需要一个后端接口去代理一系列的后端set-cookie行为。

假设中间我们跳转了两个页面,每个页面set-cookie一次,那么在代理页面返回的响应头中,会至少包含2条set-cookie头部。出于安全考虑,XMLHttpRequest并不能拿到头部的set-cookie,所以接下来,我们用小程序中的request方法,来作为进一步演示cookie处理问题的工具。

(依然未完)

转载于:https://juejin.im/post/5c1f9a11f265da615304c261

前端Cookie处理相关推荐

  1. 前端cookie的设置获取删除

    前端cookie的设置获取删除 /* 我们有过这样的经历,当我们登录一个网站时候,网站会提示我们需不需要记住账号和密码一般来说,当我们登录一个网站时,后台会返回一个token字符串作为用户的登录标识, ...

  2. 前端cookie、localStorage、sessionStorage缓存技术总结

    前端cookie.localStorage.sessionStorage缓存技术总结 转载自:https://www.cnblogs.com/belove8013/p/8134067.html 1.C ...

  3. 前端cookie 放到请求头_ajax请求携带cookie和自定义请求头header(跨域和同域)

    错误: 1.ajax请求时是不会自动带上cookie的,要是想让他带上的话,必须设置withCredential为true. 正确: 1.ajax同域请求下,ajax会自动带上同源的cookie: 2 ...

  4. 前端Cookie加密解密

    前端实现对请求中的cookie加密解密,效果如下 加密解密工具有很多,这里以Base64为例,可参考如下 https://www.jb51.net/article/138397.htm 具体的对coo ...

  5. 前后端分离项目,前端cookie获取不到的解决方案

    最近在写前后端分离项目中发现,后端在response中添加cookie后 response.addCookie(cookie) 前端却无法拿到cookie,但是在网络抓包中确实存在cookie 但是在 ...

  6. 前端Cookie基础知识

    一.简介 ​ Cookie(也称为HTTP Cookie.Web Cookie.浏览器 Cookie等等)是服务器发送到用户浏览器并保存在本地的一小块数据,该数据通常是用户账号相关的信息,不同浏览器对 ...

  7. 前端cookie设置httpOnly和secure拿不到,换成localstorage+加密方式

    之前同事用的 import Cookies from 'js-cookie'const TokenKey = 'Admin-Token'export function getToken() {retu ...

  8. 前端cookie设置及有效时间

    把一些信息放到本地cookie中并设置有效期 //获取cookie项的cookie值 function getCookie(cName) {if (document.cookie.length > ...

  9. 前端修改服务器cookie,cookie的读写以及前后端操作

    1.cookie的读写方式 1.1 cookie 客户端读取 常规cookie读取方法 function getCookies(cookiename){ var value = document.co ...

最新文章

  1. R可视化绘制对数正态分布(Log Normal Distribution)
  2. 神经网络之 CNN 与 RNN 的关系
  3. (tomcat访问不了的两种解决方法)Bad Request(Invalid Hostname)
  4. 浅谈Web中前后端模板引擎的使用
  5. 【组合数学】排列组合 ( 多重集组合数示例 | 三个计数模型 | 选取问题 | 多重集组合问题 | 不定方程非负整数解问题 )
  6. 【Paper】2009_Controllability of Multi-Agent Systems from a Graph-Theoretic Perspective 精炼版
  7. intercontenient hotels
  8. 2018 GDCPC 省赛总结
  9. joblib多线程、多进程学习案例(三)
  10. python3写网络爬虫_python3写网络爬虫
  11. Linux驱动概念扫盲篇
  12. redis持久化、内存优化、过期、LRU内存
  13. SEO要领:8文章主持技巧(两)
  14. Codeforces Round #465 935C. Fifa and Fafa计算几何
  15. 分享 45 个让你提升工作效率的前端工具
  16. win10系统cf玩一局就服务器断开,win10系统玩cf游戏经常自动退出的详细步骤
  17. Zookeeper、Curator
  18. 英语写作——必备的200条句子【写作必备!!!】
  19. JAVA集合框架工具类自定义Collections集合方法
  20. 【芝麻背调百科】神操作:公司给员工发解除通知,法院认定员工辞职

热门文章

  1. 《Android深度探索》第一章心得体会
  2. MySQL check the manual that corresponds to your MySQL server version for the right syntax错误
  3. 游戏里的---Change
  4. vc通过ADO连接sql server 2000的核心代码
  5. 百度人脸识别离线SDK_Android版_在线激活失败:not enough param_解决方案---百度人脸识别技术应用005
  6. ES6新特性_ES6生成器函数实例---JavaScript_ECMAScript_ES6-ES11新特性工作笔记022
  7. STM32工作笔记0039---认识电路图中的DS203,MS,L等
  8. java在线支付---01_在线支付功能的演示与概述
  9. fckeditor零碎要点---3.FCK:editor instanceName=myeditor value=李德伟欢迎您 height=400/FCK:editor
  10. 运行Fast R-CNN的代码