1. 存储与大小
以键值对的形式存储信息在浏览器 一般为4kb
2. 携带路径
cookie一般都是由于用户访问页面而被创建的,可是并不是只有在创建cookie的页面才可以访问这个cookie。在默认情况下,出于安全方面的考虑,只有与创建cookie的页面处于同一个目录或在创建cookie页面的子目录下的网页才可以访问。那么此时如果希望其父级或者整个网页都能够使用cookie,就需要进行路径的设置/发送Cookie的条件
浏览器在发送请求之前,首先会根据请求url中的域名在cooki列表中找所有与当前域名一样的cookie,然后再根据指定的路径进行匹配,如果当前请求在域匹配的基础上还与路径匹配那么就会将所有匹配的cookie发送给服务器,这里要注意的是最大匹配和最小匹配问题,有些cookie服务器在发送之前会有意扩大当前页面cookie的匹配范围,此时这些被扩大范围的cookie也会一起发送给服务器
cookie.setPath(String path)
注意:如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息在资源的同级目录
cookie.setPath("/WEB16");
代表访问WEB16应用中的任何资源都携带cookiecookie.setPath("/WEB16/cookieServlet");
代表访问WEB16中的cookieServlet时才携带cookie信息
3. API
- getName() 得到当前Cookie的名字
- getValue() 得到当前Cookie的值
- setValue(String newValue) 给当前cookie设置新值
- setHttpOnly(boolean httpOnly) js是否可以访问cookie,true不能访问
4. 发送
Cookie ck=new Cookie("code", code);
ck.setPath("/");
ck.setMaxAge(‐1);
response.addCookie(ck);
5. 编码与解码
Cookie中不能存储中文和英文字符不同,中文属于Unicode字符,在内存中占用4个字符,而英文属于ASCII字符,内存中只占2个字节。Cookie中使用Unicode字符时需要对Unicode字符进行编码,否则会出现乱码。编码可以使用java.net.URLEncoder类的encode(String str,String encoding)方法,解码使用java.net.URLDecoder类的decode(String str,String encoding)方法
Cookie ck=new Cookie("code", "dd");
ck.setPath("/");
response.addCookie(ck);
Cookie cookie = new Cookie(
URLEncoder.encode("姓名", StandardCharsets.UTF_8),
URLEncoder.encode("老邢", StandardCharsets.UTF_8));
cookie.setHttpOnly(true);
response.addCookie(cookie);
6. 6 发送多个
可以创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即可
Cookie c1 = new Cookie("msg","hello");
Cookie c2 = new Cookie("name","zhangsan");
response.addCookie(c1);
response.addCookie(c2);
7. 设置有效期
cookie.setMaxAge(int seconds)
如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭 cookie信息销毁(会话级别的cookie),如果设置持久化时间,cookie信息会被持久化到浏览器的磁盘文件里
- 0有效期
- =0失效
- <0内存存储
8. cookie不能跨域,当前及其父级域名可以取值
不同的tomcat服务器间cookie共享问题?
setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享
9. 获取受客户端携带的Cookie
Cookie[] cs = request.getCookies();
if(cs != null){
for (Cookie c : cs) {
String name = c.getName();
String value = c.getValue();
System.out.println(name+":"+value);
}
}
10. 注意事项
- 一个cookie只能包含一个key-value信息
- 一个cookie只能标识一种信息
- 一个Web站点可以给一个浏览器发送多个cookie
- 一个浏览器也可以储存多个Web站点发送的cookie
- 浏览器一般只允许存放300个Cookie
- 每个站点最多存放20个Cookie
- 每个Cookie的大小限制为4KB
- cookie是存放在客户端的不安全
- 浏览器禁用了cookie服务器是写不进去的