cookie机制采用的是在客户端保持 HTTP 状态信息的方案 。
Cookie是在浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP响应消息头中附带传送给浏览器的一个小文本文件。
一旦WEB浏览器保存了某个Cookie,那么它在以后每次访问该WEB服务器时,都会在HTTP请求头中将这个Cookie回传给WEB服务器。
底层的实现原理: WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器。
Servlet API中提供了一个javax.servlet.http.Cookie类来封装Cookie信息,它包含有生成Cookie信息和提取Cookie信息的各个属性的方法。
Cookie类的方法:
构造方法: public Cookie(String name,String value)
getName方法
setValue与getValue方法
setMaxAge与getMaxAge方法
setPath与getPath方法
Cookie的发送
1.创建Cookie对象
2.设置最大时效
3.将Cookie放入到HTTP响应报头
如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie; 存储在浏览器的内存中,用户退出浏览器之后被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
发送cookie需要使用HttpServletResponse的addCookie方法,将cookie插入到一个 Set-Cookie HTTP响应报头中。这个方法并不修改任何之前指定的Set-Cookie报头,而是创建新的报头。
会话cookie和持久cookie的区别
如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。
如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。
存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。
在Servlet程序中使用Cookie
HttpServletResponse接口中定义了一个addCookie方法,它用于在发送给浏览器的HTTP响应消息中增加一个Set-Cookie响应头字段。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取cookie
Cookie[] cookies=request.getCookies();
if(cookies!=null&&cookies.length>0){
for(Cookie c:cookies){
//获取cookie名
String name=c.getName();
//获取cookie值
String value=c.getValue();
System.out.println(name+":"+value);
}
}else{
//创建cookie
Cookie cookie=new Cookie("name", "zhangsan");
//设置cookie过期时间
//默认值为-1,即只保存到浏览器的缓存中,不保存到文件中,即浏览器关闭则会删除cookie
cookie.setMaxAge(20);//以秒为单位
//将创建好的cookie响应给客户端浏览器
response.addCookie(cookie);
}
}
Cookie实现跟踪用户上次访问站点的时间
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
String msg="第一次访问";
//1.获取当前系统时间
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String strDate=sdf.format(date);
//2.创建cookie
Cookie cookie=new Cookie("lastDate", strDate);
//3.设置cookie过期时间为1年
cookie.setMaxAge(60*60*24*365);
//4.将cookie响应给浏览器
response.addCookie(cookie);
//5.获取浏览器发送过来的cookie,得到具体时间
Cookie[] cookies=request.getCookies();
//6.判断是否有cookie
if(cookies!=null && cookies.length>0){
for(Cookie c:cookies){
if("lastDate".equals(c.getName())){
msg="长次访问时间:"+c.getValue();
}
}
}
out.write(msg);
}