Jsp中操作Cookie及跨域访问的详细测试.doc_第1页
Jsp中操作Cookie及跨域访问的详细测试.doc_第2页
Jsp中操作Cookie及跨域访问的详细测试.doc_第3页
Jsp中操作Cookie及跨域访问的详细测试.doc_第4页
Jsp中操作Cookie及跨域访问的详细测试.doc_第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根下创建一个index.jsp,内容如下: 0)for(int i=0;iInsert title hereThis is web1s index.jspweb2应用的web根下创建一个index.jsp,内容如下: 0)for(int i=0;iInsert title hereThis is web2s index.jsp2个应用基本一样,web1负责获取系统中的cookie然后输出name和value到控制台,并创建一个cookie,web2则只获取cookie然后输出name和value到控制台,这两个应用功能非常好理解。2个应用部署到一个tomcat下,端口为80,两个应用的访问路径分为别:/web1 和 /web2 接下来是测试过程首先用IE8访问web1,为了看到我们创建的cookie,所以需要多刷新几下,这时控制台输出如下(去除重复项后):web1-name:JSESSIONID value:D402D19B22D8E3437ECF36785B0853E1web1-name:myCookieName value:myCookieValue1清空控制台日志,然后用IE8访问web2,这时控制台输出如下:web2-name:JSESSIONID value:3E7B632C0074FD5EBA409005271EAC9Cweb2-name:myCookieName value:myCookieValue1这时说明2个应用是共享cookie的,但此时并没有实现cookie的跨域访问以上同样的测试我换成了360浏览器,并且开启了2个360浏览器的实例(非多标签),诡异的一幕出现了,访问web2应用的时候无法获得web1应用创建的cookie了,试了好多方法都不行,后来用360浏览器多标签的方式:访问测试了一下结果发现从web2可以访问到web1创建的cookie了,回想当初学习cookie知识的时候想到了一个细节,如果cookie的maxAge默认不设置的话,cookie默认是存储在浏览器的内存(缓存)当中的,web1创建的cookie就没有设置这个属性,因此得出360浏览器开启多个实例的情况下其各自都自己的内存空间,而IE8则不然,多标签或多实例都共用一个内存,那么如果想使用360浏览器多实例共享cookie的办法只有给cookie设置maxAge属性了(这样cookie会存储到磁盘中),因此web1的index.jsp代码调整了一下:Cookie cookie = new Cookie(myCookieName,myCookieValue1);cookie.setPath(/);cookie.setMaxAge(180);/设置存活周期为3分钟response.addCookie(cookie);再次测试,发现web2已经可以访问到web1创建的cookie了,并且在3分钟后再次刷新web2应用发现cookie失效(补充一点,cookie的失效不需要服务器监控其生命周期,通常浏览器自己会处理),一切正常,至此第一个测试内容结束。第二个测试内容开始,问题是这样,实际项目中客户不会使用ip地址访问应用系统的,一般都会设置域名,因此准备用域名访问一下我这两个应用,测试方式:在C:WINDOWSsystem32driversetc的hosts文件中添加如下内容: 这样在浏览器中访问时首先会到hosts文件中查找,找不到才会使用DNS去解析,使用这种方法进行测试,分别访问:/web1 和 /web2结果也是一切正常,但通过httpwatch监控发现如果cookie不设置domain的话,默认则为当前域名,即:(记住这个,很重要),两个应用使用同一个域名,所以cookie同样可以共享,也证明了域名后边斜线之后的内容是不影响cookie的,至此第二个测试内容结束,这里也补充说一句如果你用代码获取cookie然后查看其maxAge、path、domain等属性发现它的值可能是null,这是由应用服务器内部实现类决定的,这不代表你存进去的也是null,通过httpwatch是可以查看到cookie这些属性值的。第三个测试开始,与第二个类似,但域名要稍稍改变一下,在C:WINDOWSsystem32driversetc的hosts文件中添加如下内容: 然后使用IE8分别访问:/web1 和 /web2测试结果:web2应用无法访问到web1应用创建的cookie,原因如下:访问web1时cookie的domain没有设置,那么默认为,根据cookie不能跨域访问的规则,访问web2时域自然不能访问域的cookie,但其一(顶)级域名()是相同的,这时候有办法可以解决,即将web1的代码修改如下:Cookie cookie = new Cookie(myCookieName,myCookieValue1);cookie.setPath(/);cookie.setMaxAge(180);/设置存活周期为3分钟cookie.setDomain(.);response.addCookie(cookie);分别访问web1和web2,一切正常,web2又可以访问的web1的cookie了,至此第三个测试结束,证明了一(顶)级域名相同的情况下,cookie是可以实现二级(三级以上也可以)域名应用跨域访问的。(补充说一句,确定域名是几级的最简单办法是数域名中有几个点,比如是一级域名而就是二级域名以此类推,而/index.php红色字体部分不属于域名,所以这部分也不会影响cookie)第四个测试内容比较重要,要模拟的是2个应用的一级域名不同的情况,比如web1应用域名为: 而web2的域名为,还是使用hosts文件模拟不同域名访问情况,在C:WINDOWSsystem32driversetc的hosts文件中添加如下内容: 然后使用IE8分别访问/web1 和 /web2 结果证实,访问web2应用的时候无法获得web1的cookie,再访问http:/www.web1com/web2(注意红色字),这时cookie又出来了,结论如下:cookie的domain默认即为浏览器访问输入的内容,是域名即域名内容,是ip地址即为ip地址,不同ip

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论