Web 服务器和 HTTP 服务器是无状态的,因此当 Web 服务器将网页发送到浏览器时,连接会被断开,服务器会忘记与用户相关的所有内容。那么浏览器和 Web 服务器是怎样记住用户信息的?cookie 被发明出来解决这个问题。
m$ ~9 O% Z9 F9 h 当用户访问网页时,他们的名字、唯一 ID 或其他任何信息都可以存储在浏览器的 cookie 中。当用户下次又回到网页时,cookie 将记住他们的名字或唯一 ID。Cookie 只是存储在计算机浏览器中的小型文本文件。它们包含以下数据:
, C: x% n2 l9 g* M; ? 保存数据的 Name-value 对 日期到期时,该 cookie 失效 应将其发送到的服务器的域和路径2 ^! P9 \, }- u
而cookie也有一些值得一提的限制:
}9 }: D; I& R" @0 a 每个cookie的最大为 4096 字节 每个域最多20个cookie(每个浏览器略有不同) Cookie是其自己的域名专用的(网站无法读取其他域的 Cookie,只能是它自己的) 大小限制适用于整个cookie,而不仅仅是它的值 在浏览器中,cookie通过 DOM 被公开为 document.cookies。
+ R4 b1 K- J& _' Y, e5 T* g 下面介绍如何用 JavaScript 在浏览器中设置、获取、更新和删除 Cookie 数据。
9 X8 [" s* O1 ~3 Q3 i/ A' \ Create Cookies
0 S; O; d* ~, B8 Y3 p1 j8 t: C U# P 用 JavaScript 在浏览器中设置 cookie 非常简单!
+ S- [7 a( B- Q1 v( @% z" H8 T, U 1、设置 Cookie
$ d3 t& s- w# m/ d7 r7 O1 } 以下是在浏览器中用 JavaScript 创建新 cookie 的执行代码:( b# o" H3 c! u* N) }. b
document.cookie = "userId=nick123" 运行该代码后,打开浏览器,你应该能在开发者工具的 Application(Safari 或Chrome)或 Storage(Firefox)中找到该 cookie。
& M, c K, {7 N9 A6 V3 C- s9 a 2、设置 cookie 的过期时间
# w7 U1 |+ ?1 o* q 你还可以向 Cookie 中添加过期时间(UTC),告知浏览器应该在什么时候将其删除:
) p0 K/ c. A- K T; I document.cookie = "userId=nick123; expires=Wed, 15 Jan 2020 12:00:00 UTC"3、设置一个 Cookie 路径
' A6 J7 \2 u* a6 B% ]# r3 n+ v 还可以告诉浏览器 cookie 所属的路径(默认值是当前页面的路径):
- L8 Y, ^7 K# w document.cookie = "userId=nick123; expires=Wed, 15 Jan 2020 12:00:00 UTC; path=/user"4、设置 cookie 域 # U9 |1 N C! l* x5 h# `0 c; h
将介绍的最后一段数据是 cookie 所属的域(默认为当前域):, \) H: T0 i @1 e
document.cookie = "userId=nick123; expires=Wed, 15 Jan 2020 12:00:00 UTC; path=/user; domain=mysite.com"Read Cookies
+ u) T% H; ~4 w0 ?! K+ b0 ]% ] 通过 document.cookie 对象,用 JavaScript 读取 cookie 也非常简单:
, D0 M8 r, @/ O/ T 1、读取单个页面所有的 Cookie - b. ~1 B$ \% M6 g6 N( K
将单个页面的所有 cookie 作为字符串获取,每个 cookie 用分号分隔:7 M3 F( {% ?. K8 b& G' \
const cookies = document.cookie2、读取具有特定名称的Cookie
: `+ q$ G5 M. }* [8 [ 要访问具有特定名称的 cookie,需要获取页面上所有的 cookie 并解析字符串,然后查找想要寻找的 cookie 名称的匹配项。这是一个用正则表达式完成此任务的函数:
; k* [# _4 \; x: I5 o/ I( X function getCookieValue(name) {
let result = document.cookie.match("(^|[^;]+)\\s*" + name + "\\s*=\\s*([^;]+)")
return result ? result.pop() : ""
} 这样使用该函数:
/ T. @% q: \- m+ y/ m' R, l getCookieValue("userId") //returns nick123 这将返回与提供给函数的 name 参数对应的字符串值。如果你还没有掌握正则表达式,还有另一个同样功能的函数:3 o3 c6 |% O6 p5 ^' Y
function getCookieValue(name) {
const nameString = name + "="
const value = document.cookie.split(";").filter(item => {
return item.includes(nameString)
})
if (value.length) {
return value[0].substring(nameString.length, value[0].length)
} else {
return ""
}
} 用相同的方法使用该函数:! H/ K; p1 u& D' n! K
getCookieValue("userId") //returns nick123Update Cookies
) r! G* L, z; m 通过创建的方式用新值覆盖 cookie 来更改它的值。可以用此代码覆盖本文前面创建的 cookie "userId" :
7 C: G0 j5 l" s+ ^* U document.cookie = "userId=new_value" 当你再次运行 getCookieValue 函数时,将返回新值:7 X3 P6 m8 _( \) }4 e$ F2 ]
getCookieValue("userId") //returns new_valueDelete Cookies
* o3 s x E4 Z D7 m# _ 可以给 cookie 设置一个空值,并将其过期日期设置为过去的任意时间来删除 cookie。如果想要删除前面例子的 cookie "userId" ,请按以下步骤操作:
& V6 m- ~7 w' }% c: ?0 B2 n' f document.cookie = "userId=; expires=Thu, 01 Jan 1970 00:00:00 UTC;"