Cookie是Web服务器保存在用户硬盘上的一段文本,Web服务器将它发送到浏览器。之后,当再次访问同一网络时,浏览器将它原封不动地返回。其中的信息片断以"名/值"对的形式存储。
Cookie用来对客户短期跟踪,记录客户的信息等。
一. Cookie的基本运作机制
Cookie的运作机制是由HTTP协议规定的。
当客户端首次请求访问服务器时,服务器现在客户端存放包含该客户信息的Cookie,以后客户端每次请求访问服务器时,都会在HTTP请求数据中包含Cookie,服务器解析HTTP请求中的Cookie,就能获得客户的相关信息。
二. 使用Cookie
1. 创建Cookie对象(javax.servlet.http.Cookie)
每个Cookie对象都包含一个Cookie名字和Cookie值。即Cookie的构造方法有两个参数:Cookie名称和Cookie值。
Cookie login=new Cookie("CookieName","John");
2. 服务端设置Cookie
设置Cookie的注释
login.setComment("Cookie Coment");
设置Cookie有效时间
创建Cookie并将它发送到浏览器后,默认情况下的Cookie是会话级的,Cookie仅仅存储在浏览器的进程中。用户退出浏览器后,Cookie将被删除。
通过setMaxAge(time)可以设置Cookie的有效期时间。时间以秒为单位。
例:将Cookie的生命设置为一天。
login.setMaxAge(60*60*24);
如果设置的参数time>0,就指示浏览器在客户端硬盘上保存Cookie的时间为time秒。
如果设置的参数time=0,就指示浏览器删除当前Cookie。
如果设置的参数time<0,就指示浏览器不要把Cookie保存在客户端硬盘中。Cookie仅仅存在在当前浏览器进程中,当浏览器进程关闭,Cookie也就消失。
默认cookie的有效期为-1。
3. 发送Cookie到客户端
刚创建的Cookie存在于服务器内存中,必须将它发送到客户端,Cookie才能发挥作用.
发送Cookie,需要使用HttpServletResponse的addCookie方法,将Cookie插入到一个HTTP响应报头.
发送的语句如下:
public void doGet(HttpServletRequest req,HttpServletResponse res){
Cookie login=new Cookie("CookieName","John");
login.setComent("Cookie Coment");
res.addCookie(login);
}
4. 从客户端读取Cookie
读取Cookie对象中的信息:
得到cookie的名称:cookie.getName();
得到cookie的值:cookie.getValue();
得到有效期:cookie.getMaxAge();
得到需要的Cookie对象
调用request.getCookies()得到一个Cookie对象数组。该数组包含了HTTP请求中的所有Cookie。如果在HTTP请求中没有任何Cookie,则request.getCookies()返回null。
例:得到Cookie名字为"username"的Cookie对象,并且打印出Cookie中的值。
Cookie resultCookie=null;
Cookie[] cookies=request.getCookies();
if(cookies!=null){
for(int i=0;i<cookies.length;i++){
if(cookies[i].getName().equals("username")){
resultCookie=cookies[i];
break;
}
}
}
System.out.println(cookies.getValue());
调用每个Cookie的getName()方法。调用getValue()方法得到相关Cookie的值。
设置Cookie的有效范围
假如App1应用的一个Web组件X在浏览器上保存了一个Cookie,当浏览器端再次请求访问app1,app2,app3应用中的其他Web组件时。在默认情况下。处于安全的原因,只有app1应用中的Web组件能读取该Cookie。
通过cookie.setPath(Strng path),cookie.setDemain(String domain)方法来设置Cookie的path和domain属性。
1. 例:Tomcat服务器A的app1应用生成cookie:
Cookie cookie=new Cookie("CookieName","tom");
cookie.setPath("/");
response.addCookie(cookie);
"/"表示根路径。也即表示,同一个Tomcat服务器中的所有Web应用可以共享cookie。
2. 例:Tomcat服务器A的app1应用生成cookie:
Cookie cookie=new Cookie("CookieName","tom");
cookie.setPath("/app2/");
response.addCookie(cookie);
只有Tomcat服务器A中的app2应用才能访问该cookie。app1也不能访问该cookie。
3. 例:Tomcat服务器A的app1应用生成cookie:
Cookie cookie=new Cookie("CookieName","tom");
cookie.setPath("/app1/sub");
response.addCookie(cookie);
只有Tomcat服务器A中的app1应用中位于"/sub"子路径下的Web组件才能访问该cookie。
4. 例:假定Tomcat服务器B中的所有Web应用访问Cookie,假定Tomcat服务器B域名为"www.cat.com"。Tomcat服务器A的app1应用生成cookie:
Cookie cookie=new Cookie("CookieName","tom");
cookie.setDemain(".cat.tom");
response.addCookie(cookie);
这样Tomcat服务器B也能访问该cookie。
注意setDemain(String domain)的domain必须以"."开头。参数具体格式参考RFC2109文档。
5. 例:假定Tomcat服务器B中的所有Web应用访问Cookie,假定Tomcat服务器B域名为"www.cat.com"。Tomcat服务器A的app1应用生成cookie:
Cookie cookie=new Cookie("CookieName","tom");
cookie.setDemain(".cat.tom");
cookie.setPath("/app3/");
response.addCookie(cookie);
表示仅仅希望Tomcat服务器B中的app3应用能访问该cookie。