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() { }
}