HTTP Session 管理
当用户没有从会话中注销就关闭浏览器时,用户会话中的EJB不会被垃圾收集。这就是内存中有太多EJB的主要原因。要避免这种情况,HTTP session 管理必须注意所有可能的结合。我们可以在web.xml (Web应用程序部署描述符)中设置一个默认的会话超时周期,如下所示:
<session-config>
<session-timeout>x</session-timeout>
<session-config>
通过这个设置,用户的会话会在不活动x分钟后自动释放。
另一种方法是在创建HTTP session时用下面的代码编写会话管理
HttpSession session=new HttpSession ();
session.setmaxinactiveinternal(int timeoutSeconds);
这段代码会使不活动了timeoutSeconds时间的用户会话失效。
注意:如果您把两个步骤都做了,那么在servlet代码中的值将覆盖在web.xml中设置的值。
这两种方法惟一的不同点是第二种方法以秒作为参数,而 <session-timeout> 标记则是以分钟作为参数。通常,当会话失效后,logoff servlet/JSP 会用代码删去被特殊会话所引用的所有对象/对象图形的引用。但是当用户只是关闭浏览器时,就没有办法调用注销servlet/JSP。在这种情况下,即使会话已经失效,被封装的对象和对象图形会继续存在。当垃圾收集器试图对该会话进行垃圾收集时,它也会对所有这些封装对象进行收集。当我们有大对象时(拥有大的引用/数据的对象),我们也可以用HTTPSessionListener接口来进行同样的清除工作。
javax.servlet.http.HTTPSessionListener 接口
该接口声明了下面两种回调方法:
Public void sessionCreated(HttpSessionEvent event);
Public void sessionDestroyed(HttpSessionEven event);
这些方法在一个会话被创建/销毁前被调用。
我们可以使用一个实现了这个接口的监听器类,并用这些回调方法来控制会话的创建和销毁。我们需要像下面这样在web.xml中注册我们的监听器类:
<listener>
<listener-class>MySessionListener</listener-class>
</listener>
使用监听器类以及在web.xml文件中添加会话超时参数的好处是我们能对会话管理进行更多的控制。如果会话拥有大对象,那么在垃圾收集器清除这些对象之前,它的时间片可能会消失。在这种情况下,就需要等到下一个时间片才能清除这些对象。
注意:我们所设计的应用程序只有一个进入点是很重要的。我们需要在这个类中启动一个新的 HTTP session。所有余下的页面应该检查 HTTP session 是否存在,并且当会话为null时(Session 到期)调入一个错误页面。这样就可以实现对 HTTP session 的集中控制。
当用户没有从会话中注销就关闭浏览器时,用户会话中的EJB不会被垃圾收集。这就是内存中有太多EJB的主要原因。要避免这种情况,HTTP session 管理必须注意所有可能的结合。我们可以在web.xml (Web应用程序部署描述符)中设置一个默认的会话超时周期,如下所示:
<session-config>
<session-timeout>x</session-timeout>
<session-config>
通过这个设置,用户的会话会在不活动x分钟后自动释放。
另一种方法是在创建HTTP session时用下面的代码编写会话管理
HttpSession session=new HttpSession ();
session.setmaxinactiveinternal(int timeoutSeconds);
这段代码会使不活动了timeoutSeconds时间的用户会话失效。
注意:如果您把两个步骤都做了,那么在servlet代码中的值将覆盖在web.xml中设置的值。
这两种方法惟一的不同点是第二种方法以秒作为参数,而 <session-timeout> 标记则是以分钟作为参数。通常,当会话失效后,logoff servlet/JSP 会用代码删去被特殊会话所引用的所有对象/对象图形的引用。但是当用户只是关闭浏览器时,就没有办法调用注销servlet/JSP。在这种情况下,即使会话已经失效,被封装的对象和对象图形会继续存在。当垃圾收集器试图对该会话进行垃圾收集时,它也会对所有这些封装对象进行收集。当我们有大对象时(拥有大的引用/数据的对象),我们也可以用HTTPSessionListener接口来进行同样的清除工作。
javax.servlet.http.HTTPSessionListener 接口
该接口声明了下面两种回调方法:
Public void sessionCreated(HttpSessionEvent event);
Public void sessionDestroyed(HttpSessionEven event);
这些方法在一个会话被创建/销毁前被调用。
我们可以使用一个实现了这个接口的监听器类,并用这些回调方法来控制会话的创建和销毁。我们需要像下面这样在web.xml中注册我们的监听器类:
<listener>
<listener-class>MySessionListener</listener-class>
</listener>
使用监听器类以及在web.xml文件中添加会话超时参数的好处是我们能对会话管理进行更多的控制。如果会话拥有大对象,那么在垃圾收集器清除这些对象之前,它的时间片可能会消失。在这种情况下,就需要等到下一个时间片才能清除这些对象。
注意:我们所设计的应用程序只有一个进入点是很重要的。我们需要在这个类中启动一个新的 HTTP session。所有余下的页面应该检查 HTTP session 是否存在,并且当会话为null时(Session 到期)调入一个错误页面。这样就可以实现对 HTTP session 的集中控制。