Подтвердить что ты не робот

SessionTimeout: web.xml vs session.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?

4b9b3361

Ответ 1

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

Это неверно. Он просто убьет сеанс, когда связанный клиент (веб-браузер) не получит доступ к веб-сайту более 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 минут в зависимости от нагрузки и make/type сервлетаконтейнера). Поэтому не удивляйтесь, когда вы не видите строку destroyed на консоли сразу после ровно одной минуты бездействия. Однако, когда вы запускаете HTTP-запрос на сеанс с тайм-аутом, но не уничтоженным, он будет немедленно уничтожен.

См. также:

Ответ 2

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

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

Являются ли эти методы эквивалентными? Должен ли я одобрить конфигурацию web.xml?

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

Ответ 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>