|
这个主题共有 23 回复 / 2 页 [
1 2
下一页
]
|
|
|
|
|
|
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重写。不过我没有实验过,不知道会出现什么情况。
|
|
|
|
|
|
Re: HttpSession (Tomcat)的实现机制??????
|
发表: 2005年01月31日 20:01
|
回复
|
|
这是一个很有意思的问题,我也没有深入研究,希望抛砖引玉:
根据我以前做容器的经验,httpSession是和客户端的IP地址及客户端软件有关。Cookie一般是和HttpSession无关的,使用Cookie+HttpSession的技术,可以实现自动登陆功能。
|
|
|
|
|
|
Re: HttpSession (Tomcat)的实现机制??????
|
发表: 2005年01月31日 20:47
|
回复
|
|
用到cookie维护的,不过你需要监听浏览器与tomcat的交互数据就有了 浏览器每次都发送Cookie属性给tomcat,而jsessionid生存周期只是浏览器周期,所以可能并没有存入cookie记录文件
|
|
|
|
|
|
Re: HttpSession (Tomcat)的实现机制??????
|
发表: 2005年01月31日 22:41
|
回复
|
|
|
我认为 Session Cookie 不同于一般的Cookie,在硬盘上并不存在,而是在IE进程的内存中。
|
|
|
|
|
|
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。
上面是我个人看过一些资料的理解。如有不到之处,请各位大虾指出。我将不吝赐教。谢谢
|
|
|
|
|
|
Re: HttpSession (Tomcat)的实现机制??????
|
发表: 2005年02月01日 10:44
|
回复
|
|
|
其实session是通过cookie实现的,大家都用过apache的HttpClient吧,通过对客户机的cookie安全认证,确保与服务器的会话。
|
|
|
|
|
|
Re: HttpSession (Tomcat)的实现机制??????
|
发表: 2005年02月01日 16:35
|
回复
|
|
|
我对session还有个疑问:session的过期时间是怎么控制的?怎么样才能让session在过了指定时间后过期?
|
|
|
|
|
|
Re: HttpSession (Tomcat)的实现机制??????
|
发表: 2005年02月01日 23:36
|
回复
|
|
服务端记录每个sessionid的创建时间,每次调用session时会判断,如果过期,就清空session或重新分配一个sessionid,旧sessionid就死亡了
服务端与客户端Cookie的交互在http header用到SetCookie
|
|
|
|
|
|
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都会不一样,导致的结果就是,无法发新贴等等。
|
|
|
|
|
|
Re: HttpSession (Tomcat)的实现机制??????
|
发表: 2005年02月02日 11:02
|
回复
|
|
|
补充一点,像JSSESSIONID这种Cookie称之为会话Cookie,和普通Cookie还是有区别的,IE里有一个选项“总是允许会话Cookie”就是指这类Cookie,当然会话Cookie的名称可以是其他名字,不一定是JSESSIONID。
|
|
|
|
|
|
Re: HttpSession (Tomcat)的实现机制??????
|
发表: 2005年02月03日 10:15
|
回复
|
|
介绍一篇文章
http://www.zhanglihai.com/article/2005-01-24/0G7CG6C0CR4C01C27G121CG0SU2PWLAF.xtp
Session详解
|
|
|
|
|
|
Re: HttpSession (Tomcat)的实现机制??????
|
发表: 2005年02月03日 11:52
|
回复
|
|
非常敬业专业的精神。
我原来以为:浏览器如果禁止了Cookie,服务器端就使用URL重写来维持状态。
jdon的论坛是在编程时手工代码使用了Cookie,以便使得用户能够关闭所有浏览器,或者说HttpSession失效后,能够自动登陆。
|
|
|
|
|
|
Re: HttpSession (Tomcat)的实现机制??????
|
发表: 2005年02月03日 12:33
|
回复
|
|
|
cook分成两种,一种存在于磁盘上,另一种存在于ie进程内
|
|
|
|
|
|
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
|
|
|
|
|
|
Re: HttpSession (Tomcat)的实现机制??????
|
发表: 2005年03月09日 11:18
|
回复
|
|
|
Session 和 Cookie的区别和相似点是什么?
|
|
|
|
|
|
这个主题有 23 回复 / 2 页 [
1 2
下一页
]
|
|
|