第八章 cookie管理
核心方法:
1.在创建cookie对象后,将cookie发送到客户端程序之前,一般应该调用setMaxAge方法。
2.如果要指定cookie适用于您的网站上的所有URL,使用cookie.setPath("/"),也就是所有页面都接受该cookie
警告:
1.创建和操作Cookie对象对客户程序没有任何影响,必须显式地使用response.addCookie将cookie发送到客户端。
学习笔记
一、cookie的优点
1.在电子商务会话中标示用户。
2.记录用户名和密码。
3.定制站点,用户自己定制主页面的外观。用户选择希望看到的哪个天气预报等等。
4.定向广告。有cookie的情况下,通过记录之前的搜索,这些网站可以识别出我们的兴趣,从而显示出我们感兴趣的广告,而不是随机的广告。
二、cookie存在的一些问题
为了解决cookie引发的隐私问题。
1.如果能够在禁用cookie的情况下也为用户提供合理的功能。
2.作为servlet和jsp中用到的cookie,我们尽量避免用cookie存储特别敏感的信息。
三、cookie的发送和接受
1.向客户程序发送cookie
a.创建cookie对象,给出cookie的名称和cookie的值,两者都是字符串。
Cookie c =new Cookie("userID","a1234")
。
b.如果我们创建一个cookie,并将它发送到浏览器,默认情况下,它是一个会话级别的cookie,存储在浏览器的内存中,当我们关闭浏览器时,就会被删除,如果我们希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。
cookie.setMaxAge(60*60*24*7);//one week.当然最后不要忘了把它放入报头
c.将cookie放入http相应报头
response.addCookie();
综上所述:
Cookie userCookie = new Cookie("user","uid1234");
userCookie.setMaxAge(60*60*24*365);
response.addCookie(userCookie);
2.从客户端读取cookie
a.调用request.getCookies()返回Cookie对象的数组,
b.循环Cookie数组,有了cookie的数组之后,我们调用Cookie的getName方法,知道找到一个与您希望的名称想匹配的对象为止。
综上所述:
String cookieName = "userID";
Cookie [] cookies = request.getCookies();
for(int i = 0 ; i <cookies.length; i++){
Cookie cookie = cookies[i];
if(cookieName.equals(cookie.getName())){
doSomething(cookie.getValue());
}
}
四、使用cookie检测初访者
不能仅因为cookie数组为null就认为用户是个初来者,因为这可能是由于用户将cookie删除或禁用而造成的结果。但是,如果数组非null,也不过是显示客户曾经到过您的网站,并不能说明它访问过我们的servlet。
五、使用cookie属性
1.cookie属性只适用于从服务器端输出到客户端的cookie,服务器端来自于浏览器的cookie并没有设置这些属性,因而不要期望通过设置request.getCookies得到的cookie中可以使用这些属性。也就是说,我们在服务器端设置这些值,然后发送给客户端,而这些属性不存在于浏览器返回给服务器的报头,所以我们也不能取出这些cookie的属性。可以这样理解,因为cookie就是用于客户端来保存和用户有关的信息的。而在服务器端我们不需要这些特性。
2.setPath(),如果没有指定一个路径,浏览器只将该cookie返回给发送cookie的页面所在目录中或之下的URL,而setPath("/")指定服务器的所有页面都应该收到该cookie.
3.一般由于cookie的名字和值已经在cookie的构造方法中设置过了,我们只使用cookie的getName和getValue得到cookie的名字和值,而不去设置cookie的名字和值
六、区分持续cookie和会话cookie
response.setContentType("text/html");
PrintWriter out = response.getWriter();
for(int i = 0 ; i < 3 ;i++){
Cookie cookie = new Cookie("Session-Cookie"+i,"Cookie-Value-S"+i);
response.addCookie(cookie);
}
for(int i = 0 ; i < 3 ; i++){
Cookie cookie = new Cookie("Persistent-Cookie"+i,"Cookie-Value-P"+i);
cookie.setMaxAge(60*60);
response.addCookie(cookie);
}
Cookie [] cookies = request.getCookies();
String cookieName ;
String cookieValue ;
out
.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01
Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.println("<table>");
out.println("<tr>"+"<th>CookieName</th>"+"<th>CookieValue</th>"+"</tr>");
if(cookies==null){
out.println("NO Cookies");
}
else{
for(int i = 0 ; i < cookies.length;i++){
Cookie cookie = cookies[i];
cookieName = cookie.getName();
cookieValue = cookie.getValue();
out.println("<tr><td>"+cookieName+"</td>"+"<td>"+cookieValue
+"</td>"+"</tr>");
}
}
out.println("</table>");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
我们来看几种情况,首先我们初次打开浏览器时,显示的应该是No cookies,因为这时只是把完成了把cookie发送给客户端的任务。下面看两种情况,首先当我们刷新该页面时,就会显示
Session-Cookie0 Cookie-Value-S0
Session-Cookie1 Cookie-Value-S1
Session-Cookie2 Cookie-Value-S2
Persistent-Cookie0 Cookie-Value-P0
Persistent-Cookie1 Cookie-Value-P1
Persistent-Cookie2 Cookie-Value-P2
但当我们关闭原来的页面,再次打开浏览器访问该页面时,就会发现只出现
Persistent-Cookie0 Cookie-Value-P0
Persistent-Cookie1 Cookie-Value-P1
Persistent-Cookie2 Cookie-Value-P2
这就代表着会话的cookie(也就是没有设置setMaxAge的cookie)只存在于当前浏览会话,如果浏览器关闭了就不复存在,而持续的cookie就会存放在硬盘上,不会以关闭计算机或是关闭浏览器而改变。
当我们把持续cookie存放在硬盘上的时间改的短一点时。
首先当我们过了设置的时间再次刷新首次得到的浏览器客户端时,显示
Session-Cookie0 Cookie-Value-S0
Session-Cookie1 Cookie-Value-S1
Session-Cookie2 Cookie-Value-S2
因为我们并没有关闭浏览器,所以会话cookie并没有消失。而一开始发送给浏览器的持续cookie在硬盘上存放的时间也过了最大的时间限制,所以就会显示会话cookie的值。
而当我们关闭浏览器,然后过了设置的时间再次打开时,就显示No Cookie了。
七、修改cookie的值,记录用户的访问计数。
如果我们希望周期性地修改cookie的值应该怎么办?
我们只需要发送相同的cookie名称,但使用不同的cookie的值,如果我们调用setValue是没有用的,因为除了要设置其值以外,
我们还要调用setMaxAge和setPath。
String accessCount = CookieUtilities.getCookieValue(request, "accessCount", "1");
int count = Integer.parseInt(accessCount);
LongLivedCookie cookie = new LongLivedCookie("accessCount",String.valueOf(count+1));
response.addCookie(cookie);
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out
.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01
Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.println("You are the "+count+"user");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();