JiveJdon Community Forums
在线174人 Home | 论坛 | 培训咨询 | 精华 | 查搜 | 注册 | 登陆 |
首页 » 论坛 » J2EE/JavaEE/JEE/EJB/JSF等技术讨论
???en_US.forumThreadPrev.name??? 上一主题
Go back to the topic listing   返回主题列表
???en_US.forumThreadNext.name??? 下一主题
这个主题共有 23 回复 / 2 页 [ 1 2 下一页 ]  发表新帖子  回复该主题贴
holykeeper

发表文章: 25
注册时间: 2004年06月23日 17:23
给他发消息
HttpSession (Tomcat)的实现机制?????? 发表: 2005年01月27日 10:30 回复
发帖前我已搜索过论坛:
有两个相关的主题:
关闭浏览器之后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重写。不过我没有实验过,不知道会出现什么情况。
banq

发表文章: 9074
注册时间: 2002年08月03日 17:08
给他发消息
Re: HttpSession (Tomcat)的实现机制?????? 发表: 2005年01月31日 20:01 回复
这是一个很有意思的问题,我也没有深入研究,希望抛砖引玉:

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

lxleaves

发表文章: 3
注册时间: 2005年01月31日 20:42
给他发消息
Re: HttpSession (Tomcat)的实现机制?????? 发表: 2005年01月31日 20:47 回复
用到cookie维护的,不过你需要监听浏览器与tomcat的交互数据就有了
浏览器每次都发送Cookie属性给tomcat,而jsessionid生存周期只是浏览器周期,所以可能并没有存入cookie记录文件
myy

发表文章: 9
注册时间: 2005年01月21日 22:05
给他发消息
Re: HttpSession (Tomcat)的实现机制?????? 发表: 2005年01月31日 22:41 回复
我认为 Session Cookie 不同于一般的Cookie,在硬盘上并不存在,而是在IE进程的内存中。
jpollux

发表文章: 1
注册时间: 2005年02月01日 09:29
给他发消息
Re: HttpSession (Tomcat)的实现机制?????? 发表: 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

发表文章: 55
注册时间: 2003年10月11日 16:09
给他发消息
Re: HttpSession (Tomcat)的实现机制?????? 发表: 2005年02月01日 10:44 回复
其实session是通过cookie实现的,大家都用过apache的HttpClient吧,通过对客户机的cookie安全认证,确保与服务器的会话。
3dwizard

发表文章: 8
注册时间: 2004年01月30日 08:43
给他发消息
Re: HttpSession (Tomcat)的实现机制?????? 发表: 2005年02月01日 16:35 回复
我对session还有个疑问:session的过期时间是怎么控制的?怎么样才能让session在过了指定时间后过期?
lxleaves

发表文章: 3
注册时间: 2005年01月31日 20:42
给他发消息
Re: HttpSession (Tomcat)的实现机制?????? 发表: 2005年02月01日 23:36 回复
服务端记录每个sessionid的创建时间,每次调用session时会判断,如果过期,就清空session或重新分配一个sessionid,旧sessionid就死亡了

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

发表文章: 25
注册时间: 2004年06月23日 17:23
给他发消息
Re: HttpSession (Tomcat)的实现机制?????? 发表: 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

发表文章: 25
注册时间: 2004年06月23日 17:23
给他发消息
Re: HttpSession (Tomcat)的实现机制?????? 发表: 2005年02月02日 11:02 回复
补充一点,像JSSESSIONID这种Cookie称之为会话Cookie,和普通Cookie还是有区别的,IE里有一个选项“总是允许会话Cookie”就是指这类Cookie,当然会话Cookie的名称可以是其他名字,不一定是JSESSIONID。
stephen

发表文章: 19
注册时间: 2003年06月24日 15:55
给他发消息
Re: HttpSession (Tomcat)的实现机制?????? 发表: 2005年02月03日 10:15 回复
介绍一篇文章

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

Session详解
banq

发表文章: 9074
注册时间: 2002年08月03日 17:08
给他发消息
Re: HttpSession (Tomcat)的实现机制?????? 发表: 2005年02月03日 11:52 回复
非常敬业专业的精神。

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

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

发表文章: 42
注册时间: 2003年12月28日 23:11
给他发消息
Re: HttpSession (Tomcat)的实现机制?????? 发表: 2005年02月03日 12:33 回复
cook分成两种,一种存在于磁盘上,另一种存在于ie进程内
西窗&苓枫

发表文章: 1
注册时间: 2005年02月04日 15:59
给他发消息
Re: HttpSession (Tomcat)的实现机制?????? 发表: 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

发表文章: 1
注册时间: 2003年11月23日 16:33
给他发消息
Re: HttpSession (Tomcat)的实现机制?????? 发表: 2005年03月09日 11:18 回复
Session 和 Cookie的区别和相似点是什么?
这个主题有 23 回复 / 2 页 [ 1 2 下一页 ]
???en_US.forumThreadPrev.name??? 上一主题
Go back to the topic listing   返回主题列表    返回页首  返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG: AOP cache DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Spring Struts
查询本论坛内 回复超过的热门帖子
快速发表回复
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
 

解惑之道在J道 ,打造中国最具影响力的的企业软件社区
OpenSource JIVEJDON v3.0 Powered by JdonFramework Code © 2002-08 jdon.com

anti spam