TOMCAT中SESSION与COOKIE的深度探索

上传人:宝路 文档编号:3037782 上传时间:2017-07-30 格式:DOC 页数:12 大小:50.01KB
返回 下载 相关 举报
TOMCAT中SESSION与COOKIE的深度探索_第1页
第1页 / 共12页
TOMCAT中SESSION与COOKIE的深度探索_第2页
第2页 / 共12页
TOMCAT中SESSION与COOKIE的深度探索_第3页
第3页 / 共12页
TOMCAT中SESSION与COOKIE的深度探索_第4页
第4页 / 共12页
TOMCAT中SESSION与COOKIE的深度探索_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《TOMCAT中SESSION与COOKIE的深度探索》由会员分享,可在线阅读,更多相关《TOMCAT中SESSION与COOKIE的深度探索(12页珍藏版)》请在金锄头文库上搜索。

1、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/”的目标路径,几乎不在同一个服务,甚至不在同一台服务器上,这点令我很是郁闷。为了这个,我为每

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

4、示运行 parseSessionId(req, request),这个方法是在 url 中获取 sessionid 作为requestedSessionId,在同一方法的最后运行 parseSessionCookiesId(req, request),这个方法负责在 cookie 中获取 sessionid,这个方法之前会判断,如果配置中禁止 cookie,则不取cookie 中的了,也就是说无法优先选择 url 中的 sessionid,只能选择或不选择 cookie 的:(这样对于复写 tomcat 代码的梦想也几乎覆灭了,于是只能执行强加手段了。由于 cookie 中的 sessioni

5、d 是通过协议的 head 头传给服务器的,于是在 apache 中,强制改写 head 头,使“/”目录下的 sessionid 在访问/a/的时候强制实效,才解决了这个问题。纵观事件,难道我们就只能采取妥协的或者强制的方法才能解决一些郁闷的问题吗?呵呵(苦笑 ing)不知道大家有没有好的办法解决 cookie 和 session 的问题,有多少辛酸,大家都说说吧。TOMCAT 实现的 cookie 小结返回 myqueue 首页 | 更多的 IT 技术文章 | 评论(0) | 得分(0.00) 发布于:2006-10-10 浏览次数:156正常的 cookie 只能在一个应用中共享,即一个

6、 cookie 只能由创建它的应用获得。 1.可在同一应用服务器内共享方法:设置 cookie.setPath(/);本机 tomcat/webapp 下面有两个应用: cas 和 webapp_b,1)原来在 cas 下面设置的 cookie,在 webapp_b 下面获取不到,path 默认是产生cookie 的应用的路径。2)若在 cas 下面设置 cookie 的时候,增加一条 cookie.setPath(/);或者cookie.setPath(/webapp_b/);就可以在 webapp_b 下面获取到 cas 设置的 cookie 了。3)此处的参数,是相对于应用服务器存放应用

7、的文件夹的根目录而言的(比如 tomcat下面的 webapp),因此 cookie.setPath(/);之后,可以在 webapp 文件夹下的所有应用共享cookie,而 cookie.setPath (/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 下面

8、但是在 jsp 文件夹外的都不能获得cookie。5)设置 cookie.setPath(/webapp_b);,是指在 webapp_b 下面才可以使用 cookie,这样就不可以在产生 cookie 的应用 cas 下面获取 cookie 了6)有多条 cookie.setPath(XXX);语句的时候,起作用的以最后一条为准。6)设置多个 path 的方法?2.跨域共享 cookie 的方法:设置 cookie.setDomain();A 机所在的域:,A 有应用 casB 机所在的域:,B 有应用 webapp_b1)在 cas 下面设置 cookie 的时候,增加 cookie.se

9、tDomain();,这样在webapp_b 下面就可以取到 cookie。2)这个参数必须以“.”开始。3)输入 url 访问 webapp_b 的时候,必须输入域名才能解析。比如说在 A 机器输入:http:/lc-:8080/webapp_b,可以获取 cas 在客户端设置的 cookie,而 B 机器访问本机的应用,输入:http:/localhost:8080/webapp_b 则不可以获得 cookie。4)设置了 cookie.setDomain();,还可以在默认的 下面共享。5)设置多个域的方法?最近的工作经常用到 cookie,看了一些资料,虽然原来依赖 cookie 比

10、较多的方案已经改成现在这个了,但是当时看得一些东西还是最好记下来,免得过些天就一干二净了,怪可惜的。老梁说过这样的文字最好不要是纯文本的,说得是。本来就已经很抽象了,最好弄点图表,就算用123 列出来也好。session 详解- -摘要:虽然 session 机制在 web 应用程序中被采用已经很长时间了,但是仍然有很多人不清楚 session 机制的本质,以至不能正确的应用这一技术。本文将详细讨论 session 的工作机制并且对在 Java web application 中应用 session 机制时常见的问题作出解答。目录:一、术语 session二、HTTP 协议与状态保持三、理解

11、cookie 机制四、理解 session 机制五、理解 javax.servlet.http.HttpSession六、HttpSession 常见问题七、跨应用程序的 session 共享八、总结参考文档一、术语 session在我的经验里,session 这个词被滥用的程度大概仅次于 transaction,更加有趣的是 transaction 与 session 在某些语境下的含义是相同的。session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个 session。有时候我们可以看到这样的话“在一

12、个浏览器会话期间,.”,这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间 。最混乱的是“用户(客户端)在一次会话期间”这样一句话,它可能指用户的一系列动作(一般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程,有时候也被称为一个 transaction),然而有时候也可能仅仅是指一次连接,也有可能是指含义,其中的差别只能靠上下文来推断。然而当 session 一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义, “面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了电话

13、通信才能开始,与此相对的是写信,在你把信发出去的时候你并不能确认对方的地址是否正确,通信渠道不一定能建立,但对发信人来说,通信已经开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个 TCP session”或者 “一个 POP3 session”。而到了 web 服务器蓬勃发展的时代,session 在 web 开发语境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器之间保持状态的解决方案。有时候 session 也用来指这种解决方案的存储结构,如“

14、把 xxx 保存在 session 里”。由于各种用于 web 开发的语言在一定程度上都提供了对这种解决方案的支持,所以在某种特定语言的语境下,session 也被用来指代该语言的解决方案,比如经常把 Java 里提供的 javax.servlet.http.HttpSession 简称为 session。鉴于这种混乱已不可改变,本文中 session 一词的运用也会根据上下文有不同的含义,请大家注意分辨。在本文中,使用中文“浏览器会话期间”来表达含义,使用“session 机制”来表达含义,使用“session”表达含义,使用具体的“HttpSession”来表达含义二、HTTP 协议与状态

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

16、e 这些特性。其中 cookie 的作用就是为了解决 HTTP 协议无状态的缺陷所作出的努力。至于后来出现的 session 机制则是又一种在客户端与服务器之间保持状态的解决方案。让我们用几个例子来描述一下 cookie 和 session 机制之间的区别与联系。笔者曾经常去的一家咖啡店有喝 5 杯咖啡免费赠一杯咖啡的优惠,然而一次性消费 5 杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案:1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 试题/考题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号