Session是大家常用的东西,能很方便地存储每个客户端地一些变量,记录一些客户的信息,但有些朋友并不知道Session的原理,我在这里粗略说一下,一面今后再提出关于Session的初级问题。
每个Session都有一个Session ID,这个ID是存放在哪里的呢?有两种情况,一种是通过Cookie存取(Tomcat里面默认就是如此),还有一种是通过重写Url存取,后面的方法会在Url上多出一个字符串如sessionid=llkjkl3k22390等等,这样每次重新来过的时候都把Url中的SessionID传一次。而Cookie的方式就较简单,程序一开始执行,服务器就生成一个SessionID并通过Cookie写在客户端浏览器的缓冲中,当下一次访问的时候,服务器先检测一下是否有这个Cookie,如果有,取他的ID,如果没有,新生成一个。这就是为什么大家关闭浏览器后,再进去Session已经找不到了,其实在服务器端Session并没有清空,而是SessionID变了。
session里面的数据都放在服务器端,通过sessionID保证不会访问错误,服务器端自动对Session进行管理,如果在规定时间内没有访问,则释放这个Session。因此,当客户关闭浏览器,他用过的Session没有人去访问,就会在一段时间内被释放。
由上可见,Session是通过一个ID建立客户端和服务器端的联系的,因此,象那些想在浏览器关闭的同时释放Session不可行(除非触发一个页面去手工释放)就不奇怪了。因为Cookie是可窗口绑在一起的,当浏览器全部关闭,这个cookie也就没有用了,下一次再来,有新生成一个Cookie,又是一个新的Session了,大家可以试试,把浏览器的Cookie不接收,那样Session就没有用了。
每个Session都有一个Session ID,这个ID是存放在哪里的呢?有两种情况,一种是通过Cookie存取(Tomcat里面默认就是如此),还有一种是通过重写Url存取,后面的方法会在Url上多出一个字符串如sessionid=llkjkl3k22390等等,这样每次重新来过的时候都把Url中的SessionID传一次。而Cookie的方式就较简单,程序一开始执行,服务器就生成一个SessionID并通过Cookie写在客户端浏览器的缓冲中,当下一次访问的时候,服务器先检测一下是否有这个Cookie,如果有,取他的ID,如果没有,新生成一个。这就是为什么大家关闭浏览器后,再进去Session已经找不到了,其实在服务器端Session并没有清空,而是SessionID变了。
session里面的数据都放在服务器端,通过sessionID保证不会访问错误,服务器端自动对Session进行管理,如果在规定时间内没有访问,则释放这个Session。因此,当客户关闭浏览器,他用过的Session没有人去访问,就会在一段时间内被释放。
由上可见,Session是通过一个ID建立客户端和服务器端的联系的,因此,象那些想在浏览器关闭的同时释放Session不可行(除非触发一个页面去手工释放)就不奇怪了。因为Cookie是可窗口绑在一起的,当浏览器全部关闭,这个cookie也就没有用了,下一次再来,有新生成一个Cookie,又是一个新的Session了,大家可以试试,把浏览器的Cookie不接收,那样Session就没有用了。
需要注意的是,一个Session的概念需要包括特定的客户端,特定的服务器端以及不中断的操作时间。A用户和C服务器建立连接时所处的Session同B用户和C服务器中建立连接时所处的Sessions是两个不同的Session
由于它是有自己空间的,所以可以保存一些东西来处理商业事务!
kongxiangli(笑看红尘) 说得很对,我补充一下。
session过期的处理,是由Server负责的,虽然没有看过session实现的源代码,但是,肯定在Server上运行着一个后台线程,他负责把过期的session释放掉,并且会通知注册了的listener.这也就是说,你虽然声明session有效期为30*60*1000ms,但是,这个时间不会这么精确,而是只能精确到扫描的周期。比如,如果后台线程1分钟扫描一次,那么,一个过期的session,可能就会在过期0---59秒的范围内被清除
Session都有一个Session ID
客户只要调研ID就可以返回这个ID的对象如何在客户端ie关闭的情况下仍使得session在服务器端存在?
session在服务器端存
就象JNDI中的储存的一个例子,我个人认为的
java.util.Properties;
你可以在JBuilder9的thirdpart(?)的tomcat路径下找到tomcat的源代码,去那里找吧!
以为是客户定义所以存在时间应该是客户定义
当然服务器为了减少资源浪费也有个固定时间
一般情况下session在客户没有任何动作之后服务端最长保留20分钟。
但这个值在ie好像可以设定。
会话是通过Cookie的机制实现的。
当一个新用户访问网站时,我们就对这个客户建立一个会话对象,并且为这个会话对象建立一个唯一的标识,同时,向这个客户的浏览器中的Cookie写入一个表识,这个标识和session的表识是相对应的。
session是有生命周期的。也可以叫最大时间间隔。默认的情况下,是30分钟。
session对象的主要用途:
用于保存对于一个客户在一次会话(会话时间是由网站设计者决定)中的数据。
session中的主要方法:
session.setAttibute(String name,Object o);
Object session.getAttribute(String name);
设置session生命周期的方法:
session.setMaxInactiveInterval(int second);
那么,SESSION到底在服务器端存放多长时间呢?如果用户关闭IE后,SESSION还存在这么长时间,好像很浪费服务器端资源。