HttpSession (Tomcat)的实现机制??????

05-01-27 holykeeper
发帖前我已搜索过论坛:
有两个相关的主题:

关闭浏览器之后session是否就消失了

在WEB设计18条最重要的准则中,关于HTTPSESSION的疑问
大家可以参考参考

但我还是很迷惑:HttpSession的底层究竟是怎么实现的?也许有人说这是Web容器的责任,但我认为在一定程度上去了解底层的实现还是有益的。

先说说我的理解:一般会认为客户端在第一次访问Web容器时,容器会创建一个Session,这个Session被添加到一个Map 里,由容器负责维护。这个大家都很清楚,也很容易理解。但是关键是如何与客户端浏览器交换这个SessionId 的信息,很多书都提到有三种方式:cookie、URL重写、和隐藏表单,后两种是类似的。

如果是第一种,那么Sessionid被关联到一个浏览器一关闭就失效的cookie里,然后客户端浏览器每次用这个cookie来标示会话。注意这些都是Web容器替我们完成的。

如果是URL重写,则每个请求字符串后面会被附加如;jsessionid=XXXXXXXXX这样的标示,用于标示会话。

但让我困惑的是,容器采用了哪一种方法?或者说,容器何时决定使用哪一种方法?

我做了一个小实验,Web容器使用了Tomcat。在客户端与服务器进行会话时察看每次请求的cookie信息,但遗憾的是,并没有发现一个与会话相关的cookie存在。

接下来我察看了Tomcat的源代码,(只是粗粗看了看,或许没注意到),Tomcat在管理浏览器请求和会话时似乎也没有用到cookie来保存sessionid

最后我禁用了浏览器的cookie,在每次浏览器用超级链接或重定向时察看与他相关的sesssionid ,结果每次的sessionid值是不变的。

由此我认为,Tomcat在管理HttpSession时没有用到cookie的机制。

那么Tomcat是用了什么办法得知每次与他交互的是同一个浏览器呢?如果说是采用URL重写方法的话,我也没有注意到请求字符串后面多加了什么啊!

晕!

问题背景,在使用wap浏览器与Web容器进行交互时,因为wap浏览器不支持cookie,因此需要用URL重写的方法来维持会话id,由此我发现自己对HttpSession的内部机制还不是很清楚,想弄个明白,结果却越糊涂了。

Weblogic 的Web容器里提供的选项就比较多,可以选择是否启用cookie,是否启用URL重写。不过我没有实验过,不知道会出现什么情况。

1
banq
2005-01-31 20:01
这是一个很有意思的问题,我也没有深入研究,希望抛砖引玉:

根据我以前做容器的经验,httpSession是和客户端的IP地址及客户端软件有关。Cookie一般是和HttpSession无关的,使用Cookie+HttpSession的技术,可以实现自动登陆功能。

lxleaves
2005-01-31 20:47
用到cookie维护的,不过你需要监听浏览器与tomcat的交互数据就有了
浏览器每次都发送Cookie属性给tomcat,而jsessionid生存周期只是浏览器周期,所以可能并没有存入cookie记录文件

myy
2005-01-31 22:41
我认为 Session Cookie 不同于一般的Cookie,在硬盘上并不存在,而是在IE进程的内存中。

jpollux
2005-02-01 09:44
sessionId 当用户首次访问服务器时,由容器自动创建。并存放在客户端浏览器的cache中保存。在服务器上有一个有个map,我们用serverMap来粗劣表示。severMap根据sessionid来维护每个session。
session里面也保存有一个map的实例(map)。
第一次创建session时,类似的操作:
Httpsession session=request.getHttpSession();
serverMap.put(sessionId,session);
session.set("abc","abcValue");//相当于map.put("abc","abcValue")
client端每次访问浏览器,都会把sessionid带过去(透明的)。这样服务器就可以根据不同的sessionid找到各自的session。

上面是我个人看过一些资料的理解。如有不到之处,请各位大虾指出。我将不吝赐教。谢谢

zb1015
2005-02-01 10:44
其实session是通过cookie实现的,大家都用过apache的HttpClient吧,通过对客户机的cookie安全认证,确保与服务器的会话。

3dwizard
2005-02-01 16:35
我对session还有个疑问:session的过期时间是怎么控制的?怎么样才能让session在过了指定时间后过期?

lxleaves
2005-02-01 23:36
服务端记录每个sessionid的创建时间,每次调用session时会判断,如果过期,就清空session或重新分配一个sessionid,旧sessionid就死亡了

服务端与客户端Cookie的交互在http header用到SetCookie

holykeeper
2005-02-02 10:49
思考了楼上几位发言,我想我是有些明白了,又做了个实验,进一步证明了我的想法,我最初的结论有两点错误:一是认为Tomcat与客户端浏览器传递Session id时没有用到Cookie,一是认为我禁用了浏览器的Cookie,浏览器就不使用Cookie了。
我找了一个Winsock Expert的软件来监测IE 浏览器发送和接收的信息,IE的版本为6.0,Tomcat的版本为5.0.19,结果如下:当IE浏览器向Tomcat第一次发出请求时,这时候的Http请求内容如下:


不包含任何Cookie信息,当然这是第一次访问这个站点。为了比对Cookie的内容,我在访问的index.jsp页面中使用了response.setCookie向响应放了一个名为newCookie的Cookie。
最后监测的结果如下,除了用户自定义的newCookie之外,还有一个名为JSESSIONID的Cookie被加入了响应。


在接下来的请求中,都包含了JSESSIONID这个Cookie,在请求内容中能清楚的看到这一点:


但是,如果用request.getCookies是无法看到JSESSIONID这个Cookie的,只能看到我自定义的那个newCookie,JSESSIONID这个Cookie被Tomcat隐藏起来了,对于编程人员来说,是不可见的(我无法使用${cookie.JSESSIONID.name}或是${cookie.JSESSIONID.value}来检查它的名称和值,虽然这些对我来说都是已知的)。
第一个错误的解释就差不多这样了,下面看第二个错误的解释。刚才忘记了提到一点:就是我做这些实验的时候浏览器的Cookie设置都是为拒绝的。(如果设置为提示,也根本看不到提示信息,但我如果在Internet环境下访问某些网站,会有对话框提示是否使用该网站的Cookie)
JSESSIONID这个Cookie是浏览器一关闭就失效了的,我想应该是IE来在内存中管理(缓存了)这些JSESSEIONID,它不会存储在本地硬盘上,然而如果我为我的自定义的那个newCookie设置了maxAge,那么浏览器缓存里会记录newCookie的信息。
这是为什么呢?我已经禁用了Cookie呀!我察看了Windows的帮助文档,里面有这样一句话:“隐私设置仅适用于 Internet 区域中的网站”,也就是说,禁不禁用Cookie在本机环境是没有影响的?!
为了测试Internet环境下的Cookie,我又借助了jdon网站,呵呵。我先将Cookie清空,再将Cookie设置为提示,于是有了以下结果:


这里用户可以进行选择。当然如果Cookie设置都是为拒绝的,就看不到这个对话框了,每次请求的JSESSIONID都会不一样,导致的结果就是,无法发新贴等等。

holykeeper
2005-02-02 11:02
补充一点,像JSSESSIONID这种Cookie称之为会话Cookie,和普通Cookie还是有区别的,IE里有一个选项“总是允许会话Cookie”就是指这类Cookie,当然会话Cookie的名称可以是其他名字,不一定是JSESSIONID。

stephen
2005-02-03 10:15
介绍一篇文章

http://www.zhanglihai.com/article/2005-01-24/0G7CG6C0CR4C01C27G121CG0SU2PWLAF.xtp

Session详解

banq
2005-02-03 11:52
非常敬业专业的精神。

我原来以为:浏览器如果禁止了Cookie,服务器端就使用URL重写来维持状态。

jdon的论坛是在编程时手工代码使用了Cookie,以便使得用户能够关闭所有浏览器,或者说HttpSession失效后,能够自动登陆。

vcshcn
2005-02-03 12:33
cook分成两种,一种存在于磁盘上,另一种存在于ie进程内

西窗&苓枫
2005-02-04 16:51
第一次发贴:错误之处请前辈多多指正!
我要说的是:
1:Session对象在浏览器中的有效范围:
IE中:
1〉.Session对象只在建立Session对象的窗口中有效。
2〉.在建立Session对象的窗口中新开链接的窗口也有效。
Session只会在内存中,他会随着IE窗口的关闭而死亡。
也就是说单用seesion是不会有产生自动登入的效果的。
2:Cookie 是在服务器给客户端IE一个命令后在客户端产生并存的,
它可以存放用户信息,存到客户端硬盘上,在COOKIE记录被删除
或者失效日期之前,就可以实现自动登入的现象。
3:Session 和 Cookie 是不同的,但是他们确实是相关的。
当打开IE登入后,会向服务器发出一个指令请求SESSIONID以
及页面内容,服务器会返回页面内容和一个没有被使用的
SESSIONID让此IE使用,当时IE就对返回SESSIONID做存储;而当此IE再访问任何这个站点的JSP程序的时候,都会给服务器这个SESSIONID,来确认客户端的身份。(在没有Cookie 的情况下session死亡 SESSIONID被取消就需要重新登入)
4:可以通过客户端禁用和不禁用cookie来验证自己的说法。
――――――――――――大家春节愉快阿 我回家过年了 --上车前发个烂贴 --希望前辈多指正。8




whlg302
2005-03-09 11:18
Session 和 Cookie的区别和相似点是什么?

猜你喜欢
2Go 1 2 下一页