Cookie
一.HTTP协议和Cookie
- Cookie是HTTP协议制定的,先由服务器保存Cookie到浏览器,在下次浏览器请求服务器时把上一次请求得到的Cookie归还给服务器
- 由服务器创建保存到客户端浏览器的一个键值对,服务器保存Cookie的响应头:Set-Cookie:aaa=AAA Set-Cookie:bbb=BBB
response.addHeader("Set-Cookie","aaa=AAA");response.addHeader("Set-Cookie","bbb=BBB");
- 当浏览器请求服务器时,会把该服务器保存的Cookie随请求发送到服务器。浏览器归还Cookie的请求头:Cookie:aaa=AAA;bbb=BBB;
- HTTP协议规定(保证不给浏览器太大压力)
1个Cookie最大4KB
1个服务器最多向1一个浏览器保存20个Cookie
1个浏览器最多可以保存300个Cookie
二.Cookie的用途
- 服务器使用Cookie来跟踪客户端状态
- 保存购物车(购物车中的商品不能使用request保存,因为他是一个用户向服务器发送的多个请求信息)
- 显示上交登录名(也是一个用户多个请求)
三.JavaWeb中使用Cookie
>原始方式(了解):
- 使用response发送Set-Cookie响应头
- 使用request获取Cookie请求头
>便捷方式(精通):
- 使用response.addCookie()方法向浏览器保存Cookie
- 使用request.getCookies()方法获取浏览器归还的Cookie
>Cookie案例
- 通过a.jsp保存Cookie(可以在浏览器设置中查看保存的cookie)
- 通过b.jsp获取浏览器归还的Cookie
a.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Cookie cookie1 = new Cookie("aaa","AAA");
response.addCookie(cookie1);
%>
</body>
</html>
b.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Cookie[] cks = request.getCookies();
if(cks != null){
for(Cookie c : cks){
out.print(c.getName() + "=" + c.getValue() + "<br>");
}
}
%>
</body>
</html>
四.Cookie详解
Cookie不只有name和value两个属性
Cookie的maxAge:
Cookie的最大生命,即Cookie可保存的最大时长,以秒为单位,例如:cookie.setMaxAge(60)表示这个Cookie会被浏览器保存到硬盘
- maxAge>0:浏览器会把cookie保存到客户机硬盘中,有效时长为maxAge的值决定
- maxAge<0:Cookie只在浏览器内存中存在,当用户关闭浏览器时,浏览器进程结束,同时cookie也就死亡了
- maxAge=0:浏览器会马上删除这个Cookie
Cookie的path:
Cookie的path并不是设置这个Cookie在客户端的保存路径
Cookie的path由服务器创建Cookie时设置
访问路径是否带cookie路径,如果包含则归还Cookie,反之则不归还;
例如:
aCookie.path=/temp/;bCookie.path=/temp/jsp/;cCookie.path=/temp/jsp/cookies;
- 访问:/temp/index.jsp,归还aCookie
- 访问:/temp/jsp/a.jsp,归还aCookie,bCookie
- 访问:/temp/jsp/cookies/b.jsp,归还aCookie,bCookie,cCookie
Cookie的domain:
domain用来指定Cookie的域名!当多个二级域中共享Cookie时才有用
例如:www.baidu.com、zhidao.baidu.com、news.baidu.com
- 设置domain为:cookie.setDomain(".baidu.com");
- 设置path为:cookie.setPath("/");