JavaWeb之-------------网页中的Cookie技术
2015-11-22 10:12
489 查看
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技术的操作
增
如何向客户端写cookieCookie 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>
效果图:点击之前
:
点击三张之后:
点击打开链接
相关文章推荐
- cookie的secure属性详解
- 浏览器 cookie 限制
- 浅谈COOKIE和SESSION区别
- 深入解析Session是否必须依赖Cookie
- 新手菜鸟必读:session与cookie的区别
- php实现通过cookie换肤的方法
- C#中Cookie之存储对象
- C#基于WebBrowser获取cookie的实现方法
- ASP.NET Cookie 操作实现
- php中cookie的作用域
- 写入cookie的JavaScript代码库 cookieLibrary.js
- ie7下利用ajax跨域盗取cookie的解决办法
- JS使用cookie实现DIV提示框只显示一次的方法
- js 通过cookie实现刷新不变化树形菜单
- 详谈javascript中的cookie
- 不要在cookie中使用特殊字符的原因分析
- cookie在javascript中的使用技巧以及隐私在服务器端的设置
- 二级域名Cookie问题的解决方法
- 关于二级域名下使用一级域名下的COOKIE的问题