JavaWeb---会话管理---Cookie

Cookie简介

Cookie,是客户端在访问web服务器时,服务器在客户端的机器上存放的信息。
服务器将Cookie保存在客户机器上的原因是为了跟踪客户的状态。这主要用于特殊的场合如电子商务。
JavaServletApi为Cookie提供了简单实现,javax.servlet.http.Cookie类表示Cookie。
Cookie保存客户端的硬盘上,通过key和value值来保存信息,类似于Map。Cookie的key和value不能使用中文。如果要保存中文,必须使进行编码。

切记:
Cookie保存的时间通过设置setMaxAge来设置 (默认值为-1)
    如果大于0,就表示在客户机的硬盘上保存N秒。
    如果小于0,就表示不将Cookie保存到客户机的硬盘上,当浏览器关闭时,Cookie当即消失。
    如果等于0,就表示删除保存在客户机上的Cookie。


Cookie类的方法:

cookie.setMaxAge(60);在客户端保存的有效时间,以秒为单位。
cookie.setPath(“/”);设置Cookie的有效使用域。默认为当前Servlet所在的目录。
设置为/则整个tomcat有效。
设置为/myProj即,整个myProj项目有效。
setDomain(“.hncu.cn”);//设置对使用了hncu.cn一级域名的所有二级域名有效。应该配合setPath(“/”);共同使用。
setSecure(true|false);默认值为false,是否只支持https。
setHttpOnly(true|false):首先由MS推出此属性,后来被各浏览器支持。已经纳入servlet3.0规范。


保存中文的示例:

一般情况key值不建议使用中文。value值可以使用中文,但必须要经过编码才可以保存,否则保存时会抛出异常。
当然,读取经过编码的值时,必须要再解码。

向cookie中写中文时要用URLEncoder调用enccode(str, charset); 编码;从cookie中读取汉字时要调用URLDecoder调用decode(str, charset)解码



向客户机保存一个Cookie:
Cookie c = new Cookie(“name”,”value”); //声明Cookie
c.setMaxAge(60);设置时间,否则不会保存到本地文件中
response.addCookie(c);    //保存Cookie
通过以下方法读取所有Cookie
Cookie[] cs = request.getCookies();
默认情况下,只有相同目录下的应用访问有效。
如果仅希望某个应用共享Cookie可以设置
Cookie.setPath(“/项目名称”);

在项目主页的保存的Cookie的路径为项目目录下,所以,所有页面都可以读取该值。
如在/day12/index.jsp下保存的cookie默认路径为day12/即项目目录。
只要是此项目下的所有jsp\Serlvet都可以读取此Cookie的值。
而如果是day12/jsps/a.jsp下保存的cookie则默认为jsps/目录下,只有jsps目录下的jsp\Servlet才可以读取此值。
在任意页面上可以通过
setPath(“/day12”);的方式让Cookie可以在项目中的任意位置读取。
通过httpServletResponse.addCookie()保存Cookie到客户端的机器上。
保存以后Cookie一般放到C:\Documents and Settings\Administrator\cookies目录下。

示例:

1、

package cn.hncu.servlets;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Random;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CookieDemo extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		//向客户端写cookie
		Random r=new Random();
		int n=r.nextInt(100);
		String name="Jack";//cookie的格式,key=value
		//Cookie c=new Cookie("name"+n, name+n);
		Cookie c=new Cookie("name", name+n);
		c.setMaxAge(60*60);//过期时间,以秒为单位
		c.setPath(request.getContextPath());//该路径是:cookieSessionWeb/
		// Cookie机制中,是通过path来控制权限。只有<url-pattern>和该path相同或是它的子路径的servlet才能够访问该cookie。
		//如果把一个cookie的path设为项目根目录即ContextPath(),那么该项目下的所有servlet都能够访问到它。
		response.addCookie(c);
		
		//这一段演示cookie中带中文
		String str="中文";
		str=URLEncoder.encode(str, "utf-8");
		Cookie cStr=new Cookie("str", str);
		cStr.setPath("/");//路径设为“/”时,整个Tomcat下的项目都能访问到该cookie
		response.addCookie(cStr);
		
		//读取客户端发来的cookie
		Cookie cs[]=request.getCookies();//读取cookie
		if (cs!=null){
			for (Cookie cookie:cs){
				String cName=cookie.getName();
				String cValue=cookie.getValue();
				cValue=URLDecoder.decode(cValue, "utf-8");//中文就解码,ascii码则是原样
				out.print(cName+"="+cValue+"<br/>");
			}
		}
		out.print("Cookie保存成功");
	}
}

2、

package cn.hncu.servlets;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.util.Random;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CookieDemo2 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		//向客户端写cookie
		Random r=new Random();
		int n=r.nextInt(100);
		Cookie c=new Cookie("age", ""+n);
		c.setMaxAge(60*60);
		c.setPath(request.getContextPath()+"/cookieDemo2");//Cookie机制中,是通过path来控制权限
		//由于CookieDemo的url-pattern是项目根目录,不是当前CookieDemo2的cookie所设路径的子路径,因此访问不到该cookie
		//System.out.println(c.getPath());//注意,path不一样,那么cookie是不对的对象,即不会覆盖上次的
		response.addCookie(c);
		
		//读取客户端发来的cookie
		Cookie cs[]=request.getCookies();
		if (cs!=null){
			for (Cookie cookie:cs){
				String name=cookie.getName();
				String value=cookie.getValue();
				value=URLDecoder.decode(value, "utf-8");//解码中文,否则中文无法输出
				out.print("222--"+name+"="+value+"<br/>");
			}
		}
		out.print("Cookie保存成功");
	}
}

访问目录综上可以得出:子目录可以访问父目录,父目录不能访问子目录;path设置成 “/ ” 代表整个tomcat


Cookie的细节:

一个cookie只能表示简单的信息,且不能直接保存中文字符。它使用name和value的形式保存数据。
W3c规定浏览器只允许存放300个Cookie,一个站点最多可以存放20个Cookie,每个cookie的容量最大为4K.
由于各个浏览器厂商对Cookie的限制有所变化,所以保存多少个要看浏览器的支持。目前一般支持保存50-80个Cookie.每个Cookie大小为8K.可以使用IE测试。
如果创建了一个Cookie,它的生命周期默认为-1,即maxAge为-1,当关闭浏览器时,cookie即消失。可以通过setMaxAge修改它的生命周期,以秒为单位。如果设置成0,则通知浏览器删除Cookie.

我们可以通过下面的程序测试出浏览器可以保存的Cookie数和大小:

package cn.hncu.servlets;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CookieLimitServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/*测试个数
		for (int i=1;i<=100;i++){
			Cookie cookie=new Cookie("test"+i, "test"+i);
			cookie.setPath("/");//这里设置成其他值将不能执行
			cookie.setMaxAge(60*5);
			response.addCookie(cookie);
		}
		*/
		//测试大小
		String s="";
		for (int i=0;i<1024*7;i++){
			s+="1";
		}
		Cookie cookie=new Cookie("test", s);
		cookie.setMaxAge(60*15);
		cookie.setPath("/");
		response.addCookie(cookie);
	}
}

用cookie记录上次访问的时间:

package cn.hncu.servlets;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html;charset=utf-8");
		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>");
		
		//读取客户端的cookie
		Cookie cs[]=request.getCookies();
		boolean boo=false;
		if (cs!=null){
			for (Cookie cookie:cs){
				if (cookie.getName().equals("loginTime")){
					String val=cookie.getValue();
					long dt=Long.parseLong(val);
					Date date=new Date(dt);
					SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
					out.print("您上次登陆的时间是:"+sdf.format(date));
					boo=true;
					break;
				}
			}
		}
		if (!boo){
			out.print("您至少有一个月没有登录了");
		}
		
		//无论是新旧用户,都会以最近的时间来创建一个cookie,写到客户端。原来有的,就是更新
		Date date=new Date();
		long dt=date.getTime();
		Cookie c=new Cookie("loginTime", ""+dt);
		c.setMaxAge(60*60*24*30);
		c.setPath(request.getContextPath());
		response.addCookie(c);
		
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}

}

删除cookie:

只需要将cookie的对象调用setMaxAge(0);就可以了,当然,还要设置路径的,然后还要重新添加到response中去

package cn.hncu.servlets;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DeleteCookieDemo extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		Cookie cs[]=request.getCookies();
		if (cs!=null){
			for (Cookie cookie:cs){//要想遍历到“name”这个cookie,当前servlet必须要有读权限,即servlet的url-pattern必须是该cookie所设路径的相同路径或子路径
				if (cookie.getName().equals("name")){
					//删除cookie
					cookie.setPath(request.getContextPath());//删除时是通过这一句来判断权限的,必须和原来设的路径一样,否则不能删除
					cookie.setMaxAge(0);//到期时间设为0,即是删除--此处只是设置删除标记
					response.addCookie(cookie);
				}
			}
		}
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值