【Java Web 系列】Cookie 的原理分析和使用细节
一、Cookie 原理分析
Cookie 的实现原理是基于 HTTP 协议的,其中涉及到 HTTP 协议中请求头和响应头信息:
响应头:
set-cookie
请求头:
cookie
![](https://static001.geekbang.org/infoq/98/98a6364391a46e18ae5548b2d77ab2b5.png)
客户端浏览器访问服务器时,服务器通过在 HTTP 响应中增加 Set-Cookie
响应头字段
,将数据信息发送给浏览器。浏览器获取到响应结果后,从响应头中就可以获取到
Set-Cookie
对应值,并将 Cookie 保存在浏览器内存中或硬盘上。再次请求该服务器时,浏览器通过在 HTTP 请求消息中增加 Cookie
请求头字段
,将 Cookie 回传给 Web 服务器。服务器根据 Cookie 信息跟踪客户端的状态,Request 对象会把请求头中 cookie 对应的值封装成一个个 Cookie 对象,最终形成一个 cookie 数组
向浏览器发送 cookie
![](https://static001.geekbang.org/infoq/8e/8e8a5a03dbf129b85a459bc4d508c515.png)
从浏览器缓存中获取 cookie
![](https://static001.geekbang.org/infoq/63/63486527d4f611c823cb6c30b2f525c0.png)
二、Cookie 使用细节
1️⃣Cookie 的存活时间
默认情况下,Cookie 存储在浏览器内存中,当浏览器关闭,内存释放,则 Cookie 被销毁,即会话级 Cookie
设置 Cookie 存储时间
设置 Cookie 存活时间,即持久级 Cookie, 此时 Cookie 存到了
电脑磁盘
上
seconds 的参数设置详情
正数
:将 Cookie 写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除负数
:默认值,Cookie 在当前浏览器内存中,当浏览器关闭,则 Cookie 被销毁零
:使用 setMaxAge(0) 手动删除 Cookie 时,需要使用 setPath 方法指定 Cookie 的路径,且该路径必须与创建 Cookie 时的路径保持一致
2️⃣Cookie 存储中文
默认 Cookie 不能存储中文,直接传入中文会报 500 的错误
![](https://static001.geekbang.org/infoq/08/0831089cf5b03dd816d415bd111c68e0.png)
解决方案
在 AServlet 中对中文进行 URL 编码,采用
URLEncoder.encode()
,将编码后的值存入 Cookie 中在 BServlet 中获取 Cookie 中的值,获取的值为 URL 编码后的值
将获取的值在进行 URL 解码,采用
URLDecoder.decode()
,就可以获取到对应的中文值
示例
在 Servlet1 中对中文进行 URL 编码
在 Servlet2 中获取值,并对值进行解码
演示结果
存储到浏览器的是编码后的中文
![](https://static001.geekbang.org/infoq/6e/6eecc1a1be56ba6e10adc1b7163687ae.png)
获取编码的中文,并解码
![](https://static001.geekbang.org/infoq/f4/f44ad342882c11e4d8a5cf4bda1cfd9a.png)
三、Cookie 的缺点
Cookie 虽然可以解决服务器跟踪用户状态的问题,但是它具有以下缺点:
在 HTTP 请求中,Cookie 是明文传递的,容易泄露用户信息,安全性不高。
浏览器可以禁用 Cookie,一旦被禁用,Cookie 将无法正常工作。
Cookie 对象中只能设置文本信息(字符串)信息。
客户端浏览器保存 Cookie 的数量和长度是有限制的。
版权声明: 本文为 InfoQ 作者【倔强的牛角】的原创文章。
原文链接:【http://xie.infoq.cn/article/f7b8efad1c739a3e4660f4a38】。文章转载请联系作者。
评论