JavaWeb之-------------网页中的Cookie技术

来源:互联网 发布:软件授权使用协议书 编辑:程序博客网 时间:2024/05/29 13:31

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("您是第一次登录!!");}//写cookieSimpleDateFormat 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)        //如果有,就读出来并把当前浏览的图片信息追加进去,如果没有则创建一个新的Cookieif(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