JavaWeb之-------------网页中的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是Servlet中的一个类,类中常用的方法:
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里面的数据
		String aa="jack中国";
		aa=URLEncoder.encode(aa,"utf-8");
		Cookie coo=new Cookie("name", aa);//经过编码之后能显示
		coo.setMaxAge(60*60*10);//一秒为单位,这是10分钟,必须设置这个,才能让其存在本地
		response.addCookie(coo);
		out.print("存储成功");
		
//读取Cookie里面的数据
		Cookie[] cs=request.getCookies();
		for(Cookie c:cs){
			String name =c.getName();
			String value=c.getValue();
			value=URLDecoder.decode(value, "utf-8");
			out.print("name="+name+",value="+value+"<br/>");
		}


当然,读取经过编码的值时,必须要再解码。如下:
	
		//添加cookie里面的数据
		Random rom =new Random();
		int ss=rom.nextInt(1000);
		String aa="jack中国------bbbbbbbbb"+ss;
		aa=URLEncoder.encode(aa,"utf-8");
		Cookie coo=new Cookie("name", aa);//经过编码之后能显示
		coo.setMaxAge(60*60*10);//一秒为单位,这是10分钟,必须设置这个,才能让其存在本地
		coo.setPath(request.getContextPath()+"/servlet/MyCookie2");//设置权限问题----下级能访问上级的,上级不能访问下级的
		response.addCookie(coo);
		out.print("存储成功");
		
		//读取Cookie里面的数据
		Cookie[] cs=request.getCookies();
		for(Cookie c:cs){
			String name =c.getName();
			String value=c.getValue();
			value=URLDecoder.decode(value, "utf-8");
			out.print("name="+name+",value="+value+"<br/>");
		}
		



对cookie技术的操作

如何向客户端写cookie
Cookie c=new Cookie("imgs", id+",");
			c.setPath(request.getContextPath());//设置路径
			c.setMaxAge(60*60);//设置存储时间,servlet中一般是以  秒 为单位,但是前台script中以 毫秒 做单位
 		response.addCookie(c);//发出请求,存储到客户端

 查

读cookie中的数据

	Cookie[] cs=request.getCookies();
		for(Cookie c:cs){
			String name =c.getName();
			String value=c.getValue();
			value=URLDecoder.decode(value, "utf-8");
			out.print("name="+name+",value="+value+"<br/>");
		}
默认情况下,只有相同目录下的应用访问有效。如果仅希望某个应用共享Cookie可以设置
Cookie.setPath(“/项目名称”);
//常用request.getcontextPath()
通过设置的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的容量是4K,
coo.setPath(request.getContextPath()+"/servlet/MyCookie2");//设置权限问题----下级能访问上级的,上级不能访问下级的
coo.setPath(request.getContextPath());//设置为当前项目路径,默认就是这个
这二者的区别就是设置的路径不一样,规则是下级能访问上级的,上级不能访问下一级的,这个类似于局部变量和全局变量的规则

cookie采用map的Key---value形式存储,当key一样的时候,就会去匹配value,要是不一致,就会修改value.

	Cookie[] cs=request.getCookies();
		if(cs!=null){
		for(Cookie c:cs){
			if("date".equals(c.getName())){
				c.setValue("aa");}}}

cookie技术的删除很奇怪,和以前的一般的map删除不一样,我们知道在设置cookie必须设置setMaxage()属性。

 * 如果没有Cookie就创建一个新的Cookie(name,tom)
  * 如果存在名为tom的Cookie就修改为jack
 * 如果存在名为jack的Cookie就删除他


删除Cookie时,除value以外的信息必须保持完全一致,否则会导致删除不成功。如setPath(),setDomain等

删除也只需要设置setMaxAge属性即可

Cookie[] cs =request.getCookies();
		if(cs!=null){
			for(Cookie c:cs){
				if("date".equals(c.getName())){
					c.setPath(request.getContextPath());//必须要设置同样的路径
					c.setMaxAge(0);//设置为0,就可以删除了
					response.addCookie(c);}}}

    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在前台的使用

<h2>这是演示在Script里面操作cookie数据</h2>
<div id="mydiv"></div>
 <script type="text/javascript">
//增

 	//创建cookie
 	var d =new Date();
 	var hour=1000*60*60*24;//一小时。。。以ms为单位的
 	var time =d.getTime()+hour;
 	d.setTime(time);
 	var nm="湖南";
 	nm=escape(nm);
 	document.cookie="name="+nm+";expires="+d.toGMTString();//必须要加一个";expires="+d.toGMTString();
查
 	//读取cookie,因为我们知道以“;”为分界线的
 	var cs =document.cookie.split(";");
 	for(var x=0;x<cs.length;x++){
 		mydiv.innerHTML += "<br/>"+cs[x];
 		var str=cs[x].split("=");
 		mydiv.innerHTML += "<br/>"+unescape(str[1]); //读取name=value   读取value 选择第一个
 	}

 	//删除cookie
 	var d =new Date(1970,1,1);
 	//删除name为aa的cookie数据
 	 document.cookie = "name=aa;expires="+d.toGMTString()+"path=/";//d在创建的时必须要添加保留的时间,不然就会直接过期,这里就是设置过期,即-删除
 </script>


cookie的例子

每次登录显示记录上传访问的时间

主要利用cookie技术将上次访问的时间存在客户端的磁盘上,下次访问之前先读一下cookie里面设置的数据即可,同时需要再次存储本次的时间,要是第一次显示第一次登录即可。每次浏览器存放的cookie数据不在一起,所以每个浏览器访问的时间是不一样的。
		//这下面的的内容一般都是 登录成功之后,我们显示下面的内容
		//必须先读去所有的cook数据
		boolean boo=false;
		Cookie[] cs=request.getCookies();
		if(cs!=null){
		for(Cookie c:cs){
			if("date".equals(c.getName())){
				out.print("你上次登录的时间是"+c.getValue());
				boo=true;
				break;
			}
		}
		}
		if(false==boo){
			out.print("您是第一次登录!!");
		}
		//写cookie
		SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		String str=sdf.format(new Date());
		Cookie coo =new Cookie("date", str);//存储cookie的数据
		coo.setMaxAge(60*60);//设置一小时的有效时间
		coo.setPath(request.getContextPath());//设置本项目的根目录
		response.addCookie(coo);		

记录浏览图片的记录《限制最新的3张》

当用户点击一张图片时,通过Servlet向他显示图片。用户必须将要查看的图片ID或名称传到Serlvet。
在Serlvet中查询有没有用户查看过图片的Cookie信息,如果没有就创建一个新的,如果有就将本次查看的图片放到Cookie中。
在需要的页面上显示用户最近的访问记录。
浏览商品之后留下访问过的痕迹,如同京东淘宝等 ------》上次浏览过的商品下次登录还会有显示-->主要技术 Cookie技术
浏览主页面的图片,------》写在前台,点击图片-----》连接到后台,通过后台的处理带图片的参数,给用户显示出大图片,同时记录下动作,存在cookie里面,第一次需要新建,后面的只需要覆盖,在原先的技术上采用字符串的叠加就能实现,但是要求只能显示最新的三张图片,
这就需要字符串的截取和比较来完成,最后存在cookie里面就可以了,前台取就是读cookie里面的数据即可。

	String id=request.getParameter("id");//那前台传过来的参数 
		out.print("<img src='"+request.getContextPath()+"/imgs/"+id+"' />");
		boolean bo=false;
		Cookie cs[] =request.getCookies();
		先获取有没有图片浏览信息方面的cookie(本例取一个名为imgs的Cookie)
        //如果有,就读出来并把当前浏览的图片信息追加进去,如果没有则创建一个新的Cookie
		if(cs!=null){
			for(Cookie c:cs){
				if("imgs".equals(c.getName())){
					String value=c.getValue();//这是之前浏览过的记录,全部放在value里面
					if(value.contains(id)){
					value=	value.replaceAll(id+",", "");//要是包含在之前的,全部替换掉,然后重新添加
					}
					value=id+","+value;
					int len=value.split(",").length;
					if(len>=3){
						value=value.substring(0, value.lastIndexOf(","));//当大于3的时候,就截掉后面的,仅仅保留三个
					}
					c.setValue(value);//将新值放到里面去
					c.setPath(request.getContextPath());//设置路径
					c.setMaxAge(60*60);//一小时的存储时间
					//System.out.println(value);
					response.addCookie(c);//存在cookie里面,前台直接读取,解析一下<";">就是文件名了
					bo=true;
				}
			}
		}
		if(false==bo){
			Cookie c=new Cookie("imgs", id+",");
			c.setPath(request.getContextPath());
			c.setMaxAge(60*60);
			System.out.println(c.getValue());
			response.addCookie(c);
			
		}
前台:
<span style="white-space:pre">	<body>
   <h2>图片浏览</h2>
   <h3>最近浏览的 </h3>
  <%
Cookie[] cs=request.getCookies();
String str=null;
int k=2;
String[] aa=null;
if(cs!=null){
for(Cookie c:cs){
if("imgs".equals(c.getName())){
str=c.getValue();
aa=str.split(",");
for(int i=0;i<aa.length;i++){
   %>
   <img   width=80 height=40 src="<%=request.getContextPath()+"/imgs/"+aa[i]%>" />
   <%
   }}}}
    %>
   
   <hr/>
   <a href=<%=request.getContextPath()+"/servlet/LookImage?id=a.jpg"%>>
<img src=<%=request.getContextPath()+"/imgs/a.jpg"%> />
   </a>
   <a href=<%=request.getContextPath()+"/servlet/LookImage?id=b.jpg"%>>
<img src=<%=request.getContextPath()+"/imgs/b.jpg"%> />
   </a>
   <a href=<%=request.getContextPath()+"/servlet/LookImage?id=c.jpg"%>>
<img src=<%=request.getContextPath()+"/imgs/c.jpg"%> />
   </a>
   <a href=<%=request.getContextPath()+"/servlet/LookImage?id=d.jpg"%>>
<img src=<%=request.getContextPath()+"/imgs/d.jpg"%> />
   </a>
   <a href=<%=request.getContextPath()+"/servlet/LookImage?id=e.jpg"%>>
<img src=<%=request.getContextPath()+"/imgs/e.jpg"%> />
   </a>
   <a href=<%=request.getContextPath()+"/servlet/LookImage?id=f.jpg"%>>
<img src=<%=request.getContextPath()+"/imgs/f.jpg"%> /></span>
 效果图:点击之前 
点击三张之后:



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值