资源预览内容
第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
亲,该文档总共5页全部预览完了,如果喜欢就下载吧!
资源描述
做J2EE开发已经好几年了,对cookie的了解仅限于知道其使用方式、优缺点及一些简单 的基本原理,工作中有些项目也使用cookie, 基本上都是用于记录用户的登录信息(有很多知名网站用于记录客户个人信息或访问习惯的 鄙视一下),再次访问时不需要再次登录,由于我是做企业应用的,因此一般cookie也会用于做sso的方案,这个确实非常方便,尤其是多 机集群环境下,一个节点宕机,只要有另一个节点能提供服务, 用户就不会有所感知,避免了 session复制这种重量级方案。网上关于cookie的资料比较多也比较杂,有讨论用各种语言操作cookie的,也有讨论用 cookie如何实现sso的,也有变相实现cookie跨域访问的方案,今天准备用java/jsp做一个 cookie操作的完整测试,一方面加深印象,一方面给做企业应用的新手朋友一个指引,只要耐心 将下边各个测试过程跟下来,保证你对cookie会有一个更深层次的认识。多的不说了,测试环境JDK1.5 + Eclipse3.6 + Tomcat5.0.28测试过程如下:开发2个web应用,分别为web1和web2,web1 应用的 web 根下仓U建一个 index.jsp,内容如下:v!DOCTYPE html PUBLIC -/W3C/DTD HTML 4.01 Transitional/EN http:/www.w3.org/TR/html4/loose.dtd 0)for(int i=0;ivcookies.length;i+)Cookie cookie = cookiesi;System.out.println(web1cookiename:+cookie.getName()+value:+cookie.getValue();if(myCookieName.equals(cookie.getName()/如果 cookie 已存在则删除掉 cookie.setMaxAge(0);response.addCookie(cookie);用java代码创建cookie的方法如下,构造的参数是cookie的name和valueCookie cookie = new Cookie(myCookieName,myCookieValue1);cookie.setPath(/);response.addCookie(cookie);%Insert title herevbodyThis is webls index.jsp v/html web2应用的web根下创建一个index.jsp,内容如下:v% page language=java contentType=text/html; charset=UTF-8 pageEncoding=UTF-8%v!DOCTYPE html PUBLIC -/W3C/DTD HTML 4.01 Transitional/ENhttp:/www.w3.org/TR/html4/loose.dtd 0)for(int i=O;ivcookies.length;i+)Cookie cookie = cookiesi;System.out.println(web1cookiename:+cookie.getName()+value:+cookie.getValue();if(myCookieName.equals(cookie.getName()/如果 cookie 已存在则删除掉 cookie.setMaxAge(O);response.addCookie(cookie);%vmeta http-equiv=Content-Type content=text/html; charset=UTF-8Insert title hereThis is web2s index.jsp 2个应用基本一样,web1负责获取系统中的cookie然后输出name和value到控制台,并创建 一个cookie,web2则只获取cookie然后输出name和value到控制台,这两个应用功能非常好 理解。2个应用部署到一个tomcat下,端口为80,两个应用的访问路径分为别: http:/127.0.0.1/web1 和 http:/127.0.0.1/web2 接下来是测试过程 首先用IE8访问web1,为了看到我们创建的cookie,所以需要多刷新几下,这时控制台输出如下 (去除重复项后):web1-name:JSESSIONID value:D402D19B22D8E3437ECF36785B0853E1weblname:myCookieName value:myCookieValuel Insert title here - Tindovs Internet Explorerg http :/./127. 0.0.1/webl/V文件(?)編辑(E)査看(V)收藏夹S)工具 帮助00贪收藏夹|曲 屬百度 邑9kk小游戏 邑百度搜索 邑常用搜索 叵谷歌捜索g好特软件 皂起点小说 邑淘宝购物Insert titie here誉This is webls index.jsp Record . StopClear | R3 iew廷Summary C2 Find ”V Filter -E】Save & ”左Tools g) Help Started Time ChartTimeSentReceivedMethod| ResultType| URL3 00:00:00.000 Insert title here0.01000GET*http:/127.0.0.1/webl/0.009001 requestOvervi ew Time Chai t Headers Cooki ez Cache , lery String FOST Il:at:a Conti.Str e:iniCookie. Direction ValuePathDomainExpires二蜀匚二二网型逆理堇应麺g逹辽二二二二二二二二潼童二国myCookieName Sent myCookieValuel/127.0.0.1 (Session)清空控制台日志,然后用IE8访问web2,这时控制台输出如下:web2-name:JSESSIONID value:3E7B632C0074FD5EBA409005271EAC9Cweb2name:myCookieName value:myCookieValue1这时说明2个应用是共享cookie的,但此时并没有实现cookie的跨域访问以上同样的测试我换成了 360浏览器,并且开启了 2个360浏览器的实例(非多标签),诡异的 一幕出现了,访问web2应用的时候无法获得web1应用创建的cookie 了,试了好多方法都不行, 后来用360浏览器多标签的方式:詡Insert title here- 3別安全浏览器3.&正式版命砰色 O 团http:f/:L27.0.01讪巳bij令收藏 常用IPhoriE工作临旳r电脑娱乐旳AF test gov首页S Insert title here屯 Insert title hereThis is webls index.jsp访问测试了一下结果发现从web2可以访问到web1创建的cookie 了,回想当初学习cookie 知识的时候想到了一个细节,如果cookie的maxAge默认不设置的话,cookie默认是存储在浏 览器的内存(缓存)当中的,web1创建的cookie就没有设置这个属性,因此得出360浏览器开启 多个实例的情况下其各自都自己的内存空间,而IE8则不然,多标签或多实例都共用一个内存, 那么如果想使用360浏览器多实例共享cookie的办法只有给cookie设置maxAge属性了(这 样 cookie 会存储至U磁盘中),因此 webl 的index.jsp 代码调整了一下:Cookie cookie = new Cookie(myCookieName,myCookieValuel); cookie.setPath(/);cookie.setMaxAge(180);/设置存活周期为3分钟 response.addCookie(cookie);再次测试,发现web2已经可以访问到web1创建的cookie 了,并且在3分钟后再次刷新web2 应用发现cookie失效(补充一点,cookie的失效不需要服务器监控其生命周期,通常浏览器自己 会处理),一切正常,至此第一个测试内容结束。第二个测试内容开始,问题是这样,实际项目中客户不会使用ip地址访问应用系统的,一般都 会设置域名,因此准备用域名访问一下我这两个应用,测试方式:在 C:WINDOWSsystem32driversetc 的 hosts 文件中添加如下内容:127.0.0.1 www.myweb.com这样在浏览器中访问www.myweb.com时首先会到hosts文件中查找,找不到才会使用DNS 去解析,使用这种方法进行测试,分别访问:http:/www.myweb.com/web1 和 http:/www.myweb.com/web2结果也是一切正常,但通过httpwatch监控发现如果cookie不设置domain的话,默认则为当前 域名,即:www.myweb.com(记住这个,很重要),两个应用使用同一个域名,所以cookie同样可以 共享,也证明了域名后边斜线之后的内容是不影响cookie的,至此第二个测试内容结束,这里 也补充说一句如果你用代码获取cookie然后查看其maxAge、path、domain等属性发现它的 值可能是null,这是由应用服务器内部实现类决定的,这不代表你存进去的也是null,通过 httpwatch是可以查看到cookie这些属性值的。第三个测试开始,与第二个类似,但域名要稍稍改变一下,在 C:WINDOWSsystem32driversetc 的 ho
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号