Как настроить максимальную продолжительность сеанса приложения в Tomcat?

Мне нужно настроить максимальную продолжительность сеанса приложения в Tomcat на 24 часа.

Мне не удалось найти подходящую конфигурацию в документации:

https://tomcat.apache.org/tomcat-8.5-doc/config/http.html

(Есть sessionTimeout для SSLHostConfig, но мне нужна конфигурация Connector; мы разрываем соединение SSL на веб-сервере перед Tomcat, но управление сеансом обрабатывается Tomcat.)

Добавлено

Мы уже обработали тайм-аут истечения сеанса (Tomcat Session Timeout web.xml).

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


person Michael    schedule 10.01.2019    source источник


Ответы (3)


HttpSessionListener будет уведомлять только о создании и уничтожении сеанса, но не будет вызываться при каждом запросе страницы.

Я бы реализовал фильтр для проверки времени создания сеанса и аннулирования сеанса, а также установки заголовков или перенаправления.

В web.xml добавьте:

<filter>
    <filter-name>Max Session Duration</filter-name>
    <filter-class>com.your.package.MaxSessionDurationFilter</filter-class>
    <init-param>
        <!-- Maximum session duration in hours -->
        <param-name>maxduration</param-name>
        <param-value>24</param-value>
    </init-param>
</filter>

и отображение, подобное

<filter-mapping>
  <filter-name>Max Session Duration</filter-name>
  <url-pattern>*.jsp</url-pattern>
</filter-mapping>

Тогда реализация фильтра выглядит так:

package com.your.package;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MaxSessionDurationFilter implements Filter {

    private final long oneHourMillis = 1000*60*60;

    private long maxDuration;

    private FilterConfig filterConfig;

    @Override
    public void init(FilterConfig fc) throws ServletException {
        filterConfig = fc;
        maxDuration = Long.parseLong(filterConfig.getInitParameter("maxduration"));
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
        throws IOException, ServletException {
        HttpServletRequest httpReq = (HttpServletRequest) req;
        HttpServletResponse httpResp = (HttpServletResponse) resp;
        final long creationTime = httpReq.getSession().getCreationTime();
        final long currentTime = System.currentTimeMillis();
        if (currentTime-creationTime > maxDuration*oneHourMillis) {
            httpReq.getSession().invalidate();
            // Could also set headers to 403 forbidden
            // httpResp.setStatus(HttpServletResponse.SC_FORBIDDEN);
            httpResp.sendRedirect("expiredsession.jsp");
        } else {
            chain.doFilter(req, resp);
        }
    }

    @Override
    public void destroy() { }

}
person Serg M Ten    schedule 15.01.2019

Можно реализовать HttpSessionListener и уничтожить сеансы через 24 часа:

https://tomcat.apache.org/tomcat-8.5-doc/servletapi/javax/servlet/http/HttpSessionListener.html

Вопрос, если существует лучший подход.

person Michael    schedule 13.01.2019

Вы можете настроить максимальную продолжительность сеанса, используя setMaxInactiveInterval

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

Обновление при создании сеанса с использованием переопределения HttpSessionListener sessionCreated метод:

public class MyHttpSessionListener implements HttpSessionListener{
  public void sessionCreated(HttpSessionEvent event){
    event.getSession().setMaxInactiveInterval(24*60*60); //24 Hours
  }

используйте HttpSessionListener. В методе sessionCreated() вы можете установить время ожидания сеанса программно.

person user7294900    schedule 13.01.2019
comment
К сожалению, я не спрашиваю о тайм-ауте истечения сеанса. Мы настроили тайм-аут истечения сеанса через web.xml <session-config> <session-timeout>. Нам нужно аннулировать сеанс, даже если у нас есть запросы все время. - person Michael; 13.01.2019
comment
@Michael, вы можете добавить WebFilter и установить setMaxInactiveInterval stackoverflow.com/questions/39564955/ - person user7294900; 13.01.2019
comment
Спасибо, но setMaxInactiveInterval не то, что мне нужно. Я знаю решение с использованием WebFilter и HttpSessionListener. Вопрос, если вы знаете другие решения - person Michael; 13.01.2019
comment
@Michael, если вы сохраните время входа в БД, у вас может быть запланированная задача, которая находит пользователей, вошедших в систему в течение дня, и делает их сеанс недействительным. - person user7294900; 14.01.2019
comment
Благодарность! это именно подход, описанный в моем ответе - person Michael; 14.01.2019
comment
@Michael, вы можете помещать и удалять сеанс пользователя в ConcurrentHashMap в обработчике одноэлементного сеанса. - person user7294900; 14.01.2019