1. 什么是Cookie?
将用户的会话状态保存在浏览器的技术
2. Cookie的原理
- 服务器使用set-cookie的响应头,将用户的会话状态发送给浏览器进行保存
- 浏览器使用cookie的请求头,将自己保存的会话状态发送给服务器,供服务器使用
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BqNszXGF-1569735582665)(day07-5.png])
3. 具体的API
原始的API
response.setHeader("set-cookie","name=admin");
String value=request.getHeader("cookie");
value="name=admin;age=18;id=123";
Sun公司提供的API
存Cookie:
Cookie cookie=new Cookie("name","admin");
cookie.getName();
cookie.getValue();
response.addCookie(cookie);
取Cookie:
Cookie[] cs=request.getCookies();
cs->cookie1 name,admin
->cookie2 age,18
->cookie3 id,123
4. Cookie的有效时间
- 默认情况:如果没有为一个Cookie设置一个有效时间,该Cookie默认是会话级别的,保存在浏览器的内存中,一旦浏览器关闭,Cookie数据也会被销毁
- 可以主动为Cookie设置一个有效时间,该Cookie会被保存在用户的硬盘上,在Cookie到期之前,多次关闭和打开浏览器,该Cookie一直有效
- API: cookie.setMaxAge(int seconds);
5. Cookie的路径
-
浏览器在保存一个Cookie时,还会保存该Cookie的路径信息,里面包含2部分信息
- domain:指代域名,例如localhost,www.baidu.com
- path:具体的路径 /servlet07
-
当浏览器要发送一个请求时,需要判断本次请求携带哪些Cookie,判断的依据是:如果当前请求的url和一个Cookie的domain+path一致,或者是一个Cookie的domain+path的子路径,则本次请求携带该Cookie
Cookie: domain:/localhost path: /servlet07/user
url1: www.taobao.com/index.html -> 不携带
url2: localhost/servlet06/addUser -> 不携带
url3: localhost/servlet07/addUser -> 不携带
url4: localhost/servlet07/user -> 携带
url5: localhost/servlet07/user/addUser-> 携带
1. 设置一个Cookie的路径
1. 默认情况下,Cookie的path和发送它的Servlet的父路径一致
1. Servlet1 : /servlet07/user/access
2. Cookie /servlet07/user/
2. 可以手动设置一个Cookie的路径
cookie.setPath(url)
2. 为什么要设置Cookie的路径
3. 设置domain(了解)
cookie.setDomain("www.taobao.com");
大部分浏览器会默认拒绝第三方Cookie,如果发现一个Cookie设置了domain,可能直接拒收
###4. 动态获取当前项目映射的路径
request.getContextPath(); // -> /servlet08
6. Cookie的删除
服务器向浏览器发送一个和被删除Cookie同name,同path和同domain的Cookie,并将该Cookie的maxAge设置为0,浏览器收到这个新的Cookie后,会替换原Cookie,并马上删除新的Cookie
7. 浏览器如何识别一个Cookie
浏览器会根据一个Cookie的name+path+domain的组合来唯一标识一个Cookie
name path domain
“remname” /servlet07/abc localhost
“remname” /servlet07/abc www.taobao.com
“remname” /servlet07 www.taobao.com
8. Cookie中的中文问题
-
Cookie中存中文会出现异常:
Control character in cookie value or attribute. -
异常的原因
1. Cookie中存入了中文字符
2. 根据http的设计,Cookie中的数据使用ASCII字符集来传输 -
解决方案
发: username=URLEncoder.encode(username,“UTF-8”)
收: username=URLDecoder.decode(username,“UTF-8”)
8. 补充 Cookie的特点
- Cookie可能会被用户删除,稳定性不高
- Cookie保存在客户电脑上,安全性也不高
- Cookie保存数据的大小有限制,一般是4kb
- 一个浏览器保存Cookie的数量也有限制,一个网站20个,一共保存300个
- Cookie可以持久保存,例如30天