什么是Cookie:
直观上理解:
Cookie是一些键值对,服务器为了避开http协议的无状态特性,通过cookie保存的信息,达到快速识别客户端的目的。由服务器主导(由服务器负责创建,设置Cookie)。
原理:
- 第一次客户端访问服务器,服务器的响应信息中添加一些Cookie,里面有一个唯一ID。
- 第二次客户端访问服务器时,会自动把之前的Cookie带着,服务器一比较ID,就知道这是哪个客户端了。
Cookie与http协议
http协议规定:
- 1个Cookie最大4KB
- 1个服务器最多向一个浏览器保存20个
- 1个浏览器最多可以保存300个Cookie
然而,并没有卵用,浏览器不听你的。
格式:
在请求头中:
Cookie a=A; b=B
在响应头中:
Set-Cookie: a=A
Set-Cookie: b=B
JavaWeb中操作Cookie:
首先要明白,Cookie是由服务器主导的,并且Cookie是在请求头和响应头中传递的。所以首先,服务器创建并向浏览器添加Cookie:
Cookie cookie = new Cookie(key, value);
response.addCookie(cookie);
然后,浏览器再次访问这个服务器的时候,就会把cookie带回来,服务器就可以获取浏览器归还的Cookie了:
Cookie[] cs = request.getCookies();
if (cs != null) {
for (Cookie c : cs) {
response.getWriter().println(c.getName() + ":" + c.getValue());
}
}
Cookie的其他方法
生命
setMaxAge():cookie的生命时长,单位是秒
maxAge > 0:浏览器会把cookie保存到硬盘上,保存时长有maxAge值决定
maxAge <0:cookie只在内存中存在,用户关闭浏览器,浏览器进程结束,cookie也死亡了
maxAge = 0:浏览器会马上删除这个cookie
路径
setPath():cookie路径,不是在客户端的保存路径,而是返还给服务器时,由路径决定返还哪些cookie
- 浏览器访问服务器的路径,包含某个cookie的路径,就返还这个cookie
- 访问的路径名往上层找,凡是上层存的cookie都返还,即父路径里的cookie都返还
- 默认路径:当前访问路径的父路径
示例:
aCookie.path = /day11/
bCookie.path = /day11/jsp/
cCookie.path = /day11/jsp/cookie/
访问/day11/index.jsp时,返还aCookie
访问/day11/jsp/index.jsp时,返还aCookie, bCookie
访问/day11/jsp/cookie/index.jsp,返还aCookie, bCookie, cCookie
domain
setDomain():设置域名,多个二级域名共享cookie时使用
例如:www.baidu.com
zhidao.baidu.com
tieba.baidu.com
之间共享cookie
setDomain(".baidu.com");
setPath("/");
Cookie中文问题
Cookie中不能存在中文,如果需要,可以对中文进行编码存储,再解码读取
String name = URLEncoder.encode(name, "utf-8");
设置Cookie
String name =URLEncoder.decode(c.getName(), "utf-8");