注意:如果创建的cookie不设置时间的话,服务器传给客户端的cookie保存在IE缓冲区中,当浏览器关闭后,就不存在了,要想使cookie保存在硬盘中,则要使用cookie中的setMaxAge()方法设定它的保存时间。
1.1.1、cookie的一些常用方法
javax.servlet.http.Cookie类用户创建一个Cookie,response接口中也定义了增加cookie的方法:addCookie,它用户在其相应头中增加一个相应的Set-Cookie头字段。同样,request接口中也定义了一个getCookies()方法,它用户获取客户单提交的Cookie,Cookie常用的方法
构造方法:
Cookie(java.lang.String name, java.lang.String value)
setValue和getValue
setValue与getValue方法:获取和设置其Cookie的值
setMaxAge和getMaxAge
setMaxAge(int expiry) Sets the maximum age of the cookie in seconds.
getMaxAge() Returns the maximum age of the cookie, specified in seconds, By default, -1 indicating the cookie will persist until browser shutdown.
注意:如果不设置此时间,cookie的保存时间是一个会话时间,当浏览器关闭后,创建的cookie就会消失。
setPath与getPath方法
用此方法可以设置cookie在硬盘的保存路径。如果setPath方法设置/day05,说明当浏览器访问day05下的所有资源时,都会带着cookie来,如果设置为/day05/a,说明当浏览器访问day05下的a下的所有资源时,都会带着cookie来。此时如果是day05/b,则此时不会带cookie。
如果没有设置路径,则有效路径是什么呢?这需要看创建cookie的程序在那个目录下,则cookie的有效范围就是这个目录。
setDomain和getDomain方法:设置cookie的有效域。
什么是有效域呢?举个列子:www.sina.com:主机名,为整个网站,.ina.com:为域
如果调用setDomain方法设置,则参数应为:.sina.com
getName:获取cookie的名称。
1.1.2、cookie的细节
(1)一个cookie只能标识一种信息,它至少含有一个标识该信息的名称(name)和设置值(value)
(2)一个WEB站点可以给浏览器发送多个cookie,一个浏览器也可以存储多个WEB站点提供的cookie
(3)浏览器一般只允许存放300个cookie,每个站点最多存放20个cookie,每个cookie的大小限制为4KB。
(4)如果创建了一个cookie,并将它发送给浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户推出浏览器之后即被删除,若希望浏览器将该cookie存储在磁盘上,则需要使用setMaxAge方法,并给出一个以秒为单位的时间。将最大时效设为0,则是命令浏览器删除该cookie
(5)注意,删除cookie时,path必须一致,否则不会删除。
1.1.3、cookie的应用
应用一:显示用户上次访问的时间。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
//获取上次登录的时间
PrintWriter out=response.getWriter();
Cookie[]cookies=request.getCookies();
Cookie cookie1=null;
for(int i=0;cookies!=null&&i<cookies.length;i++){
cookie1=cookies[i];
if(cookie1.getName().equals("time")){
String time=cookie1.getValue();
long times=Long.parseLong(time);
String date=new SimpleDateFormat("yyyy-MM-dd").format(new Date(times));
out.print("上次访问的时间为:"+date);
}
}
//把本次登录的时间设置到cookie中去
long time=System.currentTimeMillis();
Cookie cookie=new Cookie("time",time+"");
//设置保存的时间
cookie.setMaxAge(60*20);
response.addCookie(cookie);
}
应用二:显示上次浏览过的商品。
网站首页
//网站首页
public class CookieDemo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
//1.显示网站所有商品
out.print("本网站有如下书籍:<br/>");
Map<String,Book> map = DB.getMap();
for(Map.Entry<String, Book> entry : map.entrySet()){
Book book = entry.getValue();
out.print("<a href='/day07/servlet/CookieDemo3?id="+book.getId()+"' target='_blank'>"+book.getName()+"</a><br/>");
}
class DB{
private static Map<String,Book> map = new HashMap();
static{
map.put("1", new Book("1","javaweb开发","张三"));
map.put("2", new Book("2","jdbc开发","李四"));
map.put("3", new Book("3","struts2开发","王五"));
map.put("4", new Book("4","spring开发","张三"));
map.put("5", new Book("5","hibernate开发","赵六"));
}