Значения параметра sessiontimeout: веб.xml против сессии.maxInactiveInterval()


Я пытаюсь тайм-аут в HttpSession в Java. Мой контейнер WebLogic.

В настоящее время у нас есть тайм-аут сеанса, установленный в web.xml файл, вот так

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

теперь мне говорят, что это завершит сеанс (или это все сеансы?) на 15-й минуте использования, независимо от их активности.

мне интересно, является ли этот подход правильным, или я должен программно установить ограничение по времени бездействие со стороны

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

Я не хочу отбрасывать все сеансы в течение 15 минут, только те, которые были неактивны в течение 15 минут.

эквивалентны ли эти методы? Должен ли я отдать предпочтение web.xml config?

3 58

3 ответа:

теперь мне говорят, что это завершит сеанс (или это все сеансы?) на 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());
    }

}

(если вы еще не на сервлете 3.0 и поэтому не можете использовать @WebListener, затем зарегистрировать в web.xml как следует):

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

обратите внимание, что servletcontainer не будет немедленно уничтожать сеансы после ровно тайм-аут. Это фоновое задание, которое выполняется с определенными интервалами (например, 5~15 минут в зависимости от нагрузки и типа/типа servletcontainer). Так что не удивляйтесь, когда вы не видите destroyed строка консоль сразу же после ровно одной минуты бездействия. Однако при запуске HTTP-запроса в сеансе с тайм-аутом, но еще не уничтоженном, он будет немедленно уничтожен.

Читайте также:

теперь мне говорят, что это завершит сеанс (или это все сеансы?) на 15-й минуте использования, независимо от их активности.

нет, это не правда. Элемент session-timeout настраивает тайм-аут на сеанс в случае бездействия.

эквивалентны ли эти методы? Должен ли я отдавать предпочтение сети.в xml файле?

настройки в сети.xml является глобальным, он применяется ко всем сеансам данного контекста. Программно, вы можете изменить это для конкретного сеанса.

пожалуйста, проверьте тайм-аут сеанса ниже псевдо-кода

<?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>