Session的理解

个人误区

  一开始很傻的把Session的会话与用户的登录与退出弄混淆了,实在很傻!Session的会话指的是当你打开浏览器,请求一个应用服务器时开始,直到与这个应用服务器断开连接(如关闭浏览器等)为止的一系列动作。这与用户登录完全没有关系,被弄混淆个人觉得是Session最普遍的用法就是用来控制用户的登录/退出事件的。

Session的理解

Session的机制、创建以及保存

  Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。当程序需要为某个客户端的请求创建一个Session的时候,服务器首先检查这个客户端的请求里是否已包含了一个Session标识 - 称为 Session id,如果已包含一个Session id则说明以前已经为此客户端创建过Session,服务器就按照Session id把这个 Session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含Session id,则为此客户端创建一个Session并且生 成一个与此Session相关联的Session id,Session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 Session id将被在本次响应中返回给客户端保存(客户端一般使用Cookie保存)。
  例如:当你打开浏览器时,然后输入一个地址,这个地址其实对应的是一个服务器,当你的请求被服务器响应之后,如上所说服务器首先会根据你发送的请求是否包含一个Session标识(Session-Id),如果有则不新建Session,但若是没有则新建一个Session,并将该Session的ID返回给客户端(浏览器),客户端就将该Session-Id保存到一个Cookie中(一般这个cookie的名字都是类似于SEEESIONID,而。比如weblogic对于web应用程序生成的cookie,JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是 JSESSIONID),然后每次客户端请求一个新的页面时就将该Cookie通过某种机制发送给服务器端,服务器端就知道Session已经创建了,从而不需要再新建一个Session。

Session的销毁

  Session的销毁并不是在浏览器窗口被关闭时。对于Session的销毁除非程序显示的告诉服务器销毁Session,否则服务器不会主动销毁一个Session。
然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个 session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的Session。
  Session被销毁的另一个原因就是为Session设置了失效时间,即当距离客户端上一次使用Session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把Session销毁以节省存储空间。此时当用户再次访问时,如刷新页面、再次访问等,服务器会重新创建一个Session,并生成一个新的ID。
  说明(实验得出,IE8,Google):当你访问一个服务器之后,关闭窗口(所有浏览器窗口,如IE,那就关闭所有IE窗口,一个不留),然后再打开访问同样的服务器,这时虽然上一个Session可能未被销毁,但是服务器找不到,因此就会再新建一个Session,这时会有两个Session。但是如果你未完全关不窗口的话,那么就会使用之前的Session。原因是Session-Id是保存在一个Cookie中的(测试时该Cookie名为JSESSIONID),而这个Cookie的生命周期为浏览器关闭,即浏览器关闭(完全关闭)则该Cookie就会被删除,因此服务器无法通过这个Cookie找到Session-Id,这时服务器就会认为没有Session存在,就会新建一个Session。同时这个Session的Id会覆盖之前的Session-Id,因为使用的是同一个Cookie,而Cookie会覆盖。
自己可以做试验!在IE和Google中都是可以查看Cookie的!


个人理解,有错欢迎指出!