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就没有用了。

解决方案 »

  1.   

    谢谢,可是为什么session中可以保存这么多信息呢,内部是hashmap吗
      

  2.   

    什么是Session呢?Session直接翻译成中文比较困难,一般都译成时域。在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。具体到Web中的Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。因此从上述的定义中我们可以看到,Session实际上是一个特定的时间概念。 
      需要注意的是,一个Session的概念需要包括特定的客户端,特定的服务器端以及不中断的操作时间。A用户和C服务器建立连接时所处的Session同B用户和C服务器中建立连接时所处的Sessions是两个不同的Session
      

  3.   

    Session在web开发中是在服务器端唯一标示客户端的一种结构!它的原理我不清楚,但可以肯定的是它会收集某些客户端的信息,如ip,port等,通过这些来确定客户端,或者就是个线程。它的存在期是从建立连接开始到服务器设定的timeout值到期为止。这期间每次点击都会让timeout值重新归零。
    由于它是有自己空间的,所以可以保存一些东西来处理商业事务!
      

  4.   

    HttpSession是个接口,怎么实现各个Servlet/JSP Server都是不同的,不过个人感觉Map实现应该是比较方便的,毕竟也是值名对。
    kongxiangli(笑看红尘) 说得很对,我补充一下。
    session过期的处理,是由Server负责的,虽然没有看过session实现的源代码,但是,肯定在Server上运行着一个后台线程,他负责把过期的session释放掉,并且会通知注册了的listener.这也就是说,你虽然声明session有效期为30*60*1000ms,但是,这个时间不会这么精确,而是只能精确到扫描的周期。比如,如果后台线程1分钟扫描一次,那么,一个过期的session,可能就会在过期0---59秒的范围内被清除
      

  5.   

    session产生应该是客户定义
    Session都有一个Session ID
    客户只要调研ID就可以返回这个ID的对象如何在客户端ie关闭的情况下仍使得session在服务器端存在?
    session在服务器端存
    就象JNDI中的储存的一个例子,我个人认为的
    java.util.Properties;
      

  6.   

    Session的实现应该是各种各样的!否则不会有线程安全的问题!
    你可以在JBuilder9的thirdpart(?)的tomcat路径下找到tomcat的源代码,去那里找吧!
      

  7.   

    session存在?
    以为是客户定义所以存在时间应该是客户定义
    当然服务器为了减少资源浪费也有个固定时间
      

  8.   

    session的内部结构和HashMap是一样,都是键名键值对应。
    一般情况下session在客户没有任何动作之后服务端最长保留20分钟。
    但这个值在ie好像可以设定。
      

  9.   

    会话:在网络程序中,对应于一个访问本网络程序的一个客户(浏览器),在一定的时间限制内的所有操作,我们称作为一个会话(session)。
    会话是通过Cookie的机制实现的。
    当一个新用户访问网站时,我们就对这个客户建立一个会话对象,并且为这个会话对象建立一个唯一的标识,同时,向这个客户的浏览器中的Cookie写入一个表识,这个标识和session的表识是相对应的。
    session是有生命周期的。也可以叫最大时间间隔。默认的情况下,是30分钟。
    session对象的主要用途:
    用于保存对于一个客户在一次会话(会话时间是由网站设计者决定)中的数据。
    session中的主要方法:
    session.setAttibute(String name,Object o);
    Object session.getAttribute(String name);
    设置session生命周期的方法:
    session.setMaxInactiveInterval(int second);
      

  10.   

    softgq(英雄小强):按照你所说的理解,我只需记录下这个相关的Cookie,以后即使ie关闭了(当然时间不能太长,以免服务器自己释放掉),也能访问那些与session有关的网页了
      

  11.   

    sessionID是不是就是客户端要定位的home名字?
      

  12.   

    有时候我们会遇到这种情况:好长时间没有对某个网页操作的时候,再回来,它会让我们重新登录,这种情况是不是softgq(英雄小强) 所说的“最大时间间隔”?
    那么,SESSION到底在服务器端存放多长时间呢?如果用户关闭IE后,SESSION还存在这么长时间,好像很浪费服务器端资源。