У меня есть приложение JSF и вы хотите, чтобы пользователь автоматически выходил из системы после периода бездействия. Есть ли стандартный способ сделать это?Автоматический выход из приложения JSF
ответ
Как правило, сервер (Tomcat, Glassfish ...), на котором размещено веб-приложение, обрабатывает тайм-аут для сеанса.
Например, в Tomcat, вы можете определить время ожидания сеанса для определенного веб-приложения, добавив на следующие строки в файле web.xml
:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
Это позволит установить тайм-аут до 30 минут.
Когда пользователь не отправляет какой-либо запрос за время, превышающее этот определенный тайм-аут, сеанс на сервере недействителен. Если пользователь пытается повторно подключиться после того, как сеанс был признан недействительным, он, как правило, будет перенаправлен на другую страницу или на страницу с ошибкой.
Вы можете создать собственный фильтр JSF, который автоматически перенаправит пользователя на страницу timeout.html
. Вот пример такого фильтра:
public class TimeoutFilter implements Filter {
private static final String TIMEOUT_PAGE = "timeout.html";
private static final String LOGIN_PAGE = "login.faces";
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
if ((request instanceof HttpServletRequest) && (response instanceof HttpServletResponse)) {
HttpServletRequest requestHttp = (HttpServletRequest) request;
HttpServletResponse responseHttp = (HttpServletResponse) response;
if (checkResource(requestHttp)) {
String requestPath = requestHttp.getRequestURI();
if (checkSession(requestHttp)) {
String timeoutUrl = hRequest.getContextPath() + "/" + TIMEOUT_PAGE;
responseHttp.sendRedirect(timeoutUrl);
return;
}
}
filterChain.doFilter(request, response);
}
private boolean checkResource(HttpServletRequest request) {
String requestPath = request.getRequestURI();
return !(requestPath.contains(TIMEOUT_PAGE) || requestPath.contains(LOGIN_PAGE) || requestPath.equals(hRequest.getContextPath() + "/"));
}
private boolean checkSession(HttpServletRequest request) {
return request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid();
}
public void destroy() {
}
}
это не удастся, если вы впервые получите URL-адрес не в методе checkResource. не так ли? не могли бы вы получить после этого действие с истекшим сроком действия, даже если вы просто обращаетесь к странице в первый раз? – 0m4r