论坛首页 Java企业应用论坛

Session的创建时间

浏览 11077 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-08-17  

2008年8月17日 0:25

        上一篇文章转载了《Cookie和Session专题 》,读了以后发现自己很多地方真的很白,里面的第14条:

十四、session什么时候被创建
*************************************************************************************
一个常见的错误是以为 session 在有客户端访问时就被创建,然而事实是直到某 server 端程序(如 Servlet )调用HttpServletRequest.getSession(true)这样的语句时才会被创建。
*************************************************************************************

我一开始还不信,做个试验我信了。

        一开始不信是因为,用 FireFox 测试清空了Cookie ,只要一跑一个jsp ,马上会看到生成了一个名字是 JSESSIONID 的Cookie ,注意这个是  Session Cookie (会话Cookie),不是 Persistent Cookie (持久Cookie),这个《Cookie和Session专题 》一文中讲的很明白,会话 Cookie 是为实现 session 机制而采用的在 Client 端与 Server 端之间保持状态的解决方案之一,在默认情况下是保存在 Client 端内存中的。注意:会话 Cookie 的“会话”这里不是指 Server 端的 Session ,而是指的是浏览器,所以会话 Cookie 的生命周期不是与 Server 端的 Session 那个会话相同,而是与浏览器相同,就是说只要开着浏览器会话 Cookie 就存在,关闭浏览器它就过期了。但是会话 Cookie 的值是与 Server 端的 SessionId 对应相同的。就是说会话Cookie随着Server端Session的创建而创建,但并不随着Session的过期而过期,而是随着Client端的浏览器关闭而销毁。 这说明只要会话Cookie 出现了,Server 端的 Session 就已经创建了。

        我一开始的错误想法是:我的 jsp 里没有 HttpServletRequest.getSession(true) 的代码阿,但是 JSESSIONID 的Cookie 出现了就说明 Server 端 Session 创建了,这与《Cookie和Session专题 》上面讲的不符啊,不过马上想通了,jsp 属于动态页,本质就是一个 Servlet ,编译后的 jsp 是要到 Server 端进行交互的(即便 jsp 里没写一句交互的代码),因为 jsp 里有内置对象,内置对象就是和 Server 交互的产物,所以如果你的首页是个 jsp 页的话,即便没有HttpServletRequest.getSession(true),Session 也会创建。

        如果首页是*.html 就不同了,再将 FireFox 的 Cookie 都清除了,将首页设置为 index.html, 回车,查看,果然这次没有JSESSIONID 的 Cookie 生成,这说明Server的Session也没有创建,让 index.html 提交到一个Servlet, 确实可以证明没有 HttpServletRequest.getSession(true) ,Sesion是不会创建的, 即便Servlet又转发(或者重定向)到第二个页,只要第二个页依然不是jsp页,Session就依然不会创建,FireFox 当然也没有名字为 JSESSIONID 的 Cookie 生成。

        那么我以前一直错误地认为当某个Client端请求开始时,Session就创建了,此后Session就一直存在直到过期,而request在当前Client的一系列请求操作中有可能销毁和新建,所以Session的生命周期要比request长。现在看来这么想大错特错了,Session和Request的生命周期根本就是火星和地球,拿来相比是没有任何意义的。好像是在问鲨鱼和老虎PK谁会赢,没有意义的问题. . .

        想起研究Session和Cookie是因为单位最近一个项目在做登录系统时遇到些问题,类似单点登录、Session过期、客户信息安全、Cookie使用等,下一片想些这些,我想到了3到4种方案,选择哪一种犹豫不定,因为我是个初学者,写出来是想让大家多给提提意见。特此感谢!

   发表时间:2008-08-17  
不用大惊小怪啊,多看看sun的文档,或者sun的那个第二级的考试指南就有讲的。另外,如果禁止了cookie就只能url重写来保持会话了。
0 请登录后投票
   发表时间:2008-08-24  
如果用了url重写,所有的链接都要用到url重写,非常的麻烦,与其url重写,还不如不写了
0 请登录后投票
   发表时间:2008-08-24  
Session ID 只是一个号码,对应一个Session存储空间。

浏览器进程第一次访问Web Server的时候,Web Server就分配一个Session ID。在HTTP Response中Set Cookie 返回给浏览器进程。
以后浏览器的HTTP Request都要携带这个Session ID。

Web Server 的 Session 是一个存储空间。每一个Session ID对应一个Session存储空间。
当需要用到Session存储空间的时候,就会分配这个Session空间。

----------------------
引用

就是说会话Cookie随着Server端Session的创建而创建,但并不随着Session的过期而过期,而是随着Client端的浏览器关闭而销毁。


Web Server的Session ID会过期,对应的Session存储空间也会过期。
浏览器端的Session ID传过去之后,Web Server发现找不到这个Session ID,就会报告“Session过期或者不存在”。

----------------------
引用

如果首页是*.html 就不同了,再将 FireFox 的 Cookie 都清除了,将首页设置为 index.html, 回车,查看,果然这次没有JSESSIONID 的 Cookie 生成,这说明Server的Session也没有创建,


看不明白这是在做什么。清除Cookie? 不太熟悉FireFox的清除Cookie是做什么。在IE中,清除Cookie的意思是清除“文件cookie”。和Session Cookie毫无关系。Session Cookie之存放在浏览器进程的内存中。
要测试这个问题,应该关闭当前浏览器进程,然后开启一个新的浏览器进程。

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics