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