SessionTimeout:web.xml与session.maxInactiveInterval()

时间:2010-06-25 14:51:17

标签: java session servlets weblogic session-timeout

我正在尝试在Java中超时 HttpSession 。我的容器是WebLogic。

目前,我们在 web.xml 文件中设置了会话超时,就像这样

<session-config>
    <session-timeout>15</session-timeout>
</session-config>

现在,我被告知这将在使用的第15分钟终止会话(或者是所有会话?),无论他们的活动如何。

我想知道这种方法是否正确,或者我应该以编程方式设置不活动的时间限制

session.setMaxInactiveInterval(15 * 60); //15 minutes

我不想在15分钟内放弃所有会话,只有那些在15分钟内处于非活动状态的会话。

这些方法是否相同?我应该支持 web.xml 配置吗?

3 个答案:

答案 0 :(得分:117)

  

现在,我被告知这将在使用的第15分钟终止会话(或者是所有会话?),无论其活动

错误。当关联的客户端(webbrowser)访问网站超过15分钟时,它将会终止会话。正如您最初预期的那样,活动肯定会计入您的解决方案。

顺便说一句,HttpSession#setMaxInactiveInterval()在这里没有太大变化。它与<session-timeout>中的web.xml完全相同,唯一的区别是您可以在运行时以编程方式更改/设置它。顺便说一下,更改只影响当前会话实例,而不是全局(否则它将是static方法)。


要四处游玩并体验您自己,请尝试将<session-timeout>设置为1分钟并创建HttpSessionListener,如下所示:

@WebListener
public class HttpSessionChecker implements HttpSessionListener {

    public void sessionCreated(HttpSessionEvent event) {
        System.out.printf("Session ID %s created at %s%n", event.getSession().getId(), new Date());
    }

    public void sessionDestroyed(HttpSessionEvent event) {
        System.out.printf("Session ID %s destroyed at %s%n", event.getSession().getId(), new Date());
    }

}

(如果您尚未使用Servlet 3.0,因此无法使用@WebListener,请按以下方式在web.xml中注册)

<listener>
    <listener-class>com.example.HttpSessionChecker</listener-class>
</listener>

请注意,在完全超时值之后,servletcontainer不会立即销毁会话。这是一个后台工作,它以一定的间隔运行(例如5到15分钟,具体取决于负载和servletcontainer品牌/类型)。因此,如果在一分钟不活动后立即在控制台中看不到destroyed行,请不要感到惊讶。但是,当您在超时但未被破坏的会话中触发HTTP请求时,它将立即被销毁。

另见:

答案 1 :(得分:11)

  

现在,我被告知这将在第15分钟内终止会话(或者是所有会话?),无论他们的活动如何。

不,那不是真的。如果不活动,session-timeout会配置每个会话超时。

  

这些方法是否相同?我应该支持web.xml配置吗?

web.xml中的设置是全局的,它适用于给定上下文的所有会话。以编程方式,您可以为特定会话更改此设置。

答案 2 :(得分:-3)

请在以下伪代码中检查会话超时

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"`enter code here`
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instanenter code herece"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>AccountWeb</display-name>

    <listener>
        <description>[Re]configures log4j</description>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>

    <context-param>
      <description>How often to check for changes in configfile (ms)</description>
      <param-name>log4jRefreshInterval</param-name>
      <param-value>60000</param-value>
    </context-param>
    <context-param>
      <description>Avoid setting system property as there might be several apps in same VM</description>
      <param-name>log4jExposeWebAppRoot</param-name>
      <param-value>false</param-value>
    </context-param>

    <listener>
        <description>The listener that will start Account</description>
        <display-name>AccountInitialiser</display-name>
        <listener-class>com.te.account.AccountInitializer</listener-class>
    </listener>

    <servlet>
        <display-name>Apache-Axis Servlet</display-name>
        <servlet-name>AxisServlet</servlet-name>
        <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
          <load-on-startup>200</load-on-startup>
    </servlet>

    <servlet>
        <display-name>Axis Admin Servlet</display-name>
        <servlet-name>AdminServlet</servlet-name>
        <servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class>
        <load-on-startup>100</load-on-startup>
    </servlet>


    <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>/servlet/AxisServlet</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>*.jws</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>AdminServlet</servlet-name>
        <url-pattern>/servlet/AdminServlet</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
<!--    <resource-ref>
        <description>The queue used to publish logging events</description>
        <res-ref-name>jms/LoggingAppenderQueue</res-ref-name>
        <res-type>javax.jms.Queue</res-type>
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref>
    <resource-ref>
        <description>The connection factory for the logging appender queue</description>
        <res-ref-name>jms/LoggingAppenderQueueConnFactory</res-ref-name>
        <res-type>javax.jms.QueueConnectionFactory</res-type>
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref> -->
    <resource-ref>
        <description>
        </description>
        <res-ref-name>jdbc/AccountDB</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref>
</web-app>