1、Cookie概述
保护用户的状态的两大机制:session和cookie,Cookie是Web服务器保存在客户端的一系列文本信息。主要应用场景:判断注册用户是否已经登录网站,购物车的处理等。
Cookie的作用:对待定对象的追踪,保存用户网页浏览记录与习惯,简化登录。
安全风险:容易泄露用户信息。
2、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保存的最大值超过4KB;
Cookie是不能跨浏览器的。
3、Cookie的用途
服务器使用Cookie来追踪客户端状态;
保存购物车(购物车中的商品不能使用request保存,因为它是一个用户向服务器发送的多个请求信息);
显示上次登录名(也是一个用户多个请求)。
4、JavaWeb中使用Cookie
原始方式:
使用response发送Set-Cookie响应头;
使用request获取Cookie请求头;
便捷方式:
使用response.addCookie()方法向浏览器保存Cookie;
使用request.getCookie()方法获取浏览器归还的Cookie;
创建Cookie对象:
Cookie newCookie=new Cookie(String key,Object value);
写入Cookie对象: response.addCookie(newCookie);
读取Cookie对象:
Cookie[] cookies=request.getCookies();
常用方法:
void setMaxAge(int exoiry)设置cookie的有效值,以秒为单位;
int getMaxAge()获取cookie的有效时间,以秒为单位;
void setValue(String value)在cookie创建后,对cookie进行赋值;
String getName()获取cookie的名称;
String getValue()获取cookie的值;
5、Cookie的保存和获取
在a.jsp中保存cookie,在b.jsp中获取浏览器归还的cookie
6、Cookie详解
Cookie不只有name和value两个属性,还有maxAge;
Cookie的manAge:Cookie的最大生命周期,即Cookie可保存的最长时长,以秒为单位,例如:cookie.setMaxAfe(60),表示这个Cookie会被浏览器保存到硬盘;
maxAge>0:浏览器会把Cookie保存到客户机硬盘上,有效时长为maxAge的值决定;
maxAge<0:Cookie只在浏览器内存中存在,当用户关闭浏览器时,浏览器进程结束,同事cookie也就会死亡;
maxAge=0:浏览器马上删除这个cookie;
7、Cookie的path
Cookie的path并不是设置这个cookie在客户端的保存路径;
Cookie的path由服务器创建Cookie时设置,当浏览器访问服务器某个路径时,需要归还哪些Cookie给服务器,这由Cookie的path决定;
浏览器发文服务器的路径,如果包含了某个Cookie的路径,那么就会归还这个Cookie;
例如:
aCookie.path=/hello
bCookie.path=/hello/jsps
cCookie.path=/hello/jsps/cookie
访问:/hello/index.jsp时,归还aCookie;
访问/hello/jsps/a.jsp时,归还aCookie、bCookie;
访问:/hello/jsps/cookie/b.jsp时:归还aCookie、bCookie、cCookie;
Cookie的path默认值:当前访问路径的父路径。例如在访问/hello/jsps/a.jsp时,响应的cookie,那么这个cookie的默认path为/hello/jsps
8、Cookie的域(domain)
domain用来指定Cookie的域名,当多个二级域名中共享Cookie时才会用;
例如:www.baidu.com/rj.baidu.com/new.baidu.com之间共享Cookie时可以使用domain。
设置domain为:、cookie.setDomain(".baidu.com")
设置path为:cookie.setPath("/")