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。

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

猜你喜欢
5Go 1 2 3 4 ... 5 下一页