ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:28.37KB ,
资源ID:6337665      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6337665.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(TOMCAT中SESSION与COOKIE的深度探索.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

TOMCAT中SESSION与COOKIE的深度探索.docx

1、TOMCAT中SESSION与COOKIE的深度探索Tomcat中Session与cookie的深度探索(续)由于业务需要,昨天稍微研究了一下tomcat处理session的机制,对此有了更为深刻的理解,现在记下来,供大家参考和讨论。大家也许都了解,tomcat为了维持和浏览器之间的session对应关系,主要采用三种方式:1cookie纪录sessionId;2url重写;3隐藏表单,这个几乎和url重写意义相同; 之前,我一直非常相信浏览器的cookie,即便浏览器端关闭了cookie,也相信tomcat会自动帮忙重写url,但是进入到wap这行后,cookie就不敢那么恭维了; 有些手机

2、浏览器就只能保持一个cookie,并且对于cookie的维护性极差到一定地步,例如在“/”根目录下的sessionId存储与路径为“/”的cookie中,而遇到“/a/”的情况,由于手机浏览器只能保持一个cookie,它居然愚蠢到将这个cookie里的sesionid等同于“/”中的sessionid,就不再纪录了,也就是说“/a/”中的sessionid强制和“/”中的一样,并且每次访问“/a/”中的sessionid和“/”的一样; 大家都知道,对于很多时候“/”和“/a/”的目标路径,几乎不在同一个服务,甚至不在同一台服务器上,这点令我很是郁闷。 为了这个,我为每个链接的后面就加上了se

3、ssionid,这样居然还是不行,后来我查看了许多tomcat相关的文档,在配置文件的context中有个cookies选项,如果配置为false,则不信任浏览器的cookie,只信任url后面的jsessionid,但是公司的服务很大很杂,如果我更改了这个选项,怕影响到其它服务,最妥协的办法就是让tomcat先选择url后面的sessionid,如果没有再去cookie中去找,但是我没有发现这样的配置选项; 于是乎我查看起了tomcat的源代码,后来发现CoyoteAdapter类中对于sessionid的处理是这样的,显示运行parseSessionId(req, request),这个方

4、法是在url中获取sessionid作为requestedSessionId,在同一方法的最后运行parseSessionCookiesId(req, request),这个方法负责在cookie中获取sessionid,这个方法之前会判断,如果配置中禁止cookie,则不取cookie中的了,也就是说无法优先选择url中的sessionid,只能选择或不选择cookie的:( 这样对于复写tomcat代码的梦想也几乎覆灭了,于是只能执行强加手段了。 由于cookie中的sessionid是通过协议的head头传给服务器的,于是在apache中,强制改写head头,使“/”目录下的sessio

5、nid在访问/a/的时候强制实效,才解决了这个问题。 纵观事件,难道我们就只能采取妥协的或者强制的方法才能解决一些郁闷的问题吗?呵呵(苦笑ing) 不知道大家有没有好的办法解决cookie和session的问题,有多少辛酸,大家都说说吧。TOMCAT实现的cookie小结返回myqueue首页 | 更多的IT技术文章 | 评论(0) | 得分(0.00) 发布于:2006-10-10 浏览次数:156正常的cookie只能在一个应用中共享,即一个cookie只能由创建它的应用获得。 1.可在同一应用服务器内共享方法:设置cookie.setPath(/);本机tomcat/webapp下面有两

6、个应用:cas和webapp_b,1)原来在cas下面设置的cookie,在webapp_b下面获取不到,path默认是产生cookie的应用的路径。2)若在cas下面设置cookie的时候,增加一条cookie.setPath(/);或者cookie.setPath(/webapp_b/);就可以在webapp_b下面获取到cas设置的cookie了。 3)此处的参数,是相对于应用服务器存放应用的文件夹的根目录而言的(比如tomcat下面的webapp),因此 cookie.setPath(/);之后,可以在webapp文件夹下的所有应用共享cookie,而cookie.setPath (/

7、webapp_b/);是指cas应用设置的cookie只能在webapp_b应用下的获得,即便是产生这个cookie的cas应用也不可以。4)设置 cookie.setPath(/webapp_b/jsp)或者cookie.setPath (/webapp_b/jsp/)的时候,只有在webapp_b/jsp下面可以获得cookie,在webapp_b下面但是在jsp文件夹外的都不能获得cookie。5)设置cookie.setPath(/webapp_b);,是指在webapp_b下面才可以使用cookie,这样就不可以在产生cookie的应用cas下面获取cookie了6)有多条cooki

8、e.setPath(XXX);语句的时候,起作用的以最后一条为准。6)设置多个path的方法?2.跨域共享cookie的方法:设置cookie.setDomain();A机所在的域:,A有应用casB机所在的域:,B有应用webapp_b1)在cas下面设置cookie的时候,增加cookie.setDomain();,这样在webapp_b下面就可以取到cookie。2)这个参数必须以“.”开始。3)输入url访问webapp_b的时候,必须输入域名才能解析。比如说在A机器输入:http:/lc-:8080/webapp_b,可以获取cas在客户端设置的cookie,而B机器访问本机的应用,

9、输入:http:/localhost:8080/webapp_b则不可以获得cookie。4)设置了cookie.setDomain();,还可以在默认的下面共享。5)设置多个域的方法?最近的工作经常用到cookie,看了一些资料,虽然原来依赖cookie比较多的方案已经改成现在这个了,但是当时看得一些东西还是最好记下来,免得过些天就一干二净了,怪可惜的。老梁说过这样的文字最好不要是纯文本的,说得是。本来就已经很抽象了,最好弄点图表,就算用123列出来也好。session详解- - 摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本

10、质,以至不能正确的应用这一技术。本文将详细讨论session的工作机制并且对在Javawebapplication中应用session机制时常见的问题作出解答。目录:一、术语session二、HTTP协议与状态保持三、理解cookie机制四、理解session机制五、理解javax.servlet.http.HttpSession六、HttpSession常见问题七、跨应用程序的session共享八、总结参考文档一、术语session在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相同的。se

11、ssion,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个 session。有时候我们可以看到这样的话“在一个浏览器会话期间,.”,这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间 。最混乱的是“用户(客户端)在一次会话期间”这样一句话,它可能指用户的一系列动作(一般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程,有时候也被称为一个transaction),然而有时候也可能仅仅是指一次连接,也有可能是指含义,其中的差别只能靠上下文来推断。然而当

12、session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义, “面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始,与此相对的是写信,在你把信发出去的时候你并不能确认对方的地址是否正确,通信渠道不一定能建立,但对发信人来说,通信已经开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个TCPsession”或者 “一个POP3session”。而到了web服务器蓬勃发展的时代,se

13、ssion在web开发语境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器之间保持状态的解决方案。有时候session也用来指这种解决方案的存储结构,如“把xxx保存在session 里”。由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持,所以在某种特定语言的语境下,session也被用来指代该语言的解决方案,比如经常把Java里提供的javax.servlet.http.HttpSession简称为session。鉴于这种混乱已不可改变,本文中session一词的运用也会根据上下文有不同的含义,请大家注意分辨。在本文中,使用中文“浏览器会话期间”来表达含义,使

14、用“session机制”来表达含义,使用“session”表达含义,使用具体的“HttpSession”来表达含义二、HTTP协议与状态保持HTTP 协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的,好比一个顾客和一个自动售货机或者一个普通的(非会员制)大卖场之间的关系一样。然而聪明(或者贪心?)的人们很快发现如果能够提供一些按需生成的动态信息会使web变得更加有用,就像给有线电视加上点播功能一样。这种需求一方面迫使HTML逐步添加了表单、脚本、DOM等客户端行为,另

15、一方面在服务器端则出现了CGI规范以响应客户端的动态请求,作为传输载体的HTTP协议也添加了文件上载、 cookie这些特性。其中cookie的作用就是为了解决HTTP协议无状态的缺陷所作出的努力。至于后来出现的session机制则是又一种在客户端与服务器之间保持状态的解决方案。让我们用几个例子来描述一下cookie和session机制之间的区别与联系。笔者曾经常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案:1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店

16、,店员就知道该怎么对待了。这种做法就是协议本身支持状态。2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择。具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服

17、务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。三、理解cookie机制cookie机制的基本原理就如上面的例子一样简单,但是还有几个问题需要解决:“会员卡”如何分发;“会员卡”的内容;以及客户如何使用“会员卡”。正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。而coo

18、kie 的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示,如果某家分店还发行了自己的会员卡,那么进这家店的时候除了要出示麦当劳的会员卡,还要出示这家店的会员卡。cookie的内容主要包括:名字,值,过期时间,路径和域。其中域可以指定某一个域比如,相当于总店招牌,比如宝洁公司,也可以指定一个域下的具体某台机器比如或者,可以用飘柔来做比。路径就是跟在域名后面的URL路径,比如/或者/f

19、oo等等,可以用某飘柔专柜做比。路径与域合在一起就构成了cookie的作用范围。如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的 cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie 可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方

20、式。对于IE,在一个打开的窗口上按 Ctrl-N(或者从文件菜单)打开的窗口可以与原窗口共享,而使用其他方式新开的IE进程则不能共享已经打开的窗口的内存cookie;对于 MozillaFirefox0.8,所有的进程和标签页都可以共享同样的cookie。一般来说是用javascript的window.open打开的窗口会与原窗口共享内存cookie。浏览器对于会话cookie的这种只认cookie不认人的处理方式经常给采用session机制的web应用程序开发者造成很大的困扰。下面就是一个goolge设置cookie的响应头的例子HTTP/1.1302FoundLocation:Set-Co

21、okie:PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8;expires=Sun,17-Jan-203819:14:07GMT;path=/;domain=Content-Type:text/html这是使用HTTPLook这个HTTPSniffer软件来俘获的HTTP通讯纪录的一部分浏览器在再次访问goolge的资源时自动向外发送cookie使用Firefox可以很容易的观察现有的cookie的值使用HTTPLook配合Firefox可以很容易的理解cookie的工作原理。IE也可以设置

22、在接受cookie前询问这是一个询问接受cookie的对话框。四、理解session机制session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识-称为 sessionid,如果已包含一个sessionid则说明以前已经为此客户端创建过session,服务器就按照sessionid把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含sessionid,则为此客户端创建一个session并

23、且生成一个与此session相关联的sessionid,sessionid的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 sessionid将被在本次响应中返回给客户端保存。保存这个sessionid的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID,而。比如weblogic对于web应用程序生成的cookie,JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是 JS

24、ESSIONID。由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把sessionid传递回服务器。经常被使用的一种技术叫做URL重写,就是把sessionid直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为http:/./xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764另一种是作为查询字符串附加在URL后面,表现形式为http:/./xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV

25、6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把sessionid的信息和正常程序参数区分开来。为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个sessionid。另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把sessionid传递回服务器。比如下面的表单在被传递给客户端之前将被改写成这种技术现在已较少应用,笔者接触过的很古老的iPlanet6(SunONE应用服务器的前身)就使用了这种技

26、术。实际上这种技术可以简单的用对action应用URL重写来代替。在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览器,session就消失了”。其实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做logoff的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存sess

27、ionid,而关闭浏览器后这个 sessionid就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的sessionid发送给服务器,则再次打开浏览器仍然能够找到原来的session。恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。五、理解javax.servlet.http.HttpSessionHt

28、tpSession是Java平台对session机制的实现规范,因为它仅仅是个接口,具体到每个web应用服务器的提供商,除了对规范支持之外,仍然会有一些规范里没有规定的细微差异。这里我们以BEA的WeblogicServer8.1作为例子来演示。首先,WeblogicServer提供了一系列的参数来控制它的HttpSession的实现,包括使用cookie的开关选项,使用URL重写的开关选项,session持久化的设置,session失效时间的设置,以及针对cookie的各种设置,比如设置cookie的名字、路径、域, cookie的生存时间等。一般情况下,session都是存储在内存里,当服

29、务器进程被停止或者重启的时候,内存里的session也会被清空,如果设置了session的持久化特性,服务器就会把session保存到硬盘上,当服务器进程重新启动或这些信息将能够被再次使用, WeblogicServer支持的持久性方式包括文件、数据库、客户端cookie保存和复制。复制严格说来不算持久化保存,因为session实际上还是保存在内存里,不过同样的信息被复制到各个cluster内的服务器进程中,这样即使某个服务器进程停止工作也仍然可以从其他进程中取得session。cookie生存时间的设置则会影响浏览器生成的cookie是否是一个会话cookie。默认是使用会话cookie。有

30、兴趣的可以用它来试验我们在第四节里提到的那个误解。cookie的路径对于web应用程序来说是一个非常重要的选项,WeblogicServer对这个选项的默认处理方式使得它与其他服务器有明显的区别。后面我们会专题讨论。关于session的设置参考5http:/e-六、HttpSession常见问题(在本小节中session的含义为和的混合)1、session在何时被创建一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果JSP没有显示的使用关闭session,则JSP文件在编

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1