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