У меня следующая проблема с таймаутами в Spring Security с JSF:
Я настроил фильтр управления сеансом так, чтобы пользователь перенаправлялся на invalidSessionUrl только в том случае, если запрошенная страница защищена (т. Е. Если она разрешена только для аутентифицированных пользователей). Пользовательский код, который я вставил в фильтр управления сеансами, предоставляемый Spring Security:
if (invalidSessionUrl != null) {
String pagSolicitada = UtilSpringSecurity.extraerPagina(request);
if ( UtilSpringSecurity.paginaAutenticada(pagSolicitada ) ) {
request.getSession();
redirectStrategy.sendRedirect(request, response, invalidSessionUrl);
return;
}
//the requested page doesn't require the user to be authenticated
//so i just skip this filter and continue with the filter chain
chain.doFilter(request, response);
return;
}
Метод "UtilSpringSecurity.extraerPagina (request)" возвращает запрошенную страницу следующим образом:
public static String extraerPagina (HttpServletRequest request) {
String uri = request.getRequestURI().toLowerCase();
String cPath = request.getContextPath().toLowerCase();
// uri = cPath + pagina
int longCPath = cPath.length();
String pagina = uri.substring(longCPath);
return pagina;
}
И метод "UtilSpringSecurity.paginaAutenticada (pagSolicitada)" возвращает значение true, если параметром является страница, требующая аутентификации пользователя (я проверяю с помощью IF, учитывая элементы intercept-url моего файла конфигурации безопасности xml которые имеют атрибут access="isAuthenticated()"
):
public static boolean paginaAutenticada (String pagina) {
if (pagina.startsWith("/faces/paginas/administracion/") || pagina.startsWith("/faces/paginas/barco/") ) {
return true;
}
return false;
}
Это решение работает, но у него есть только одна проблема:
Если я оставлю браузер бездействующим на странице, пока не истечет время ожидания сеанса, а затем я запрашиваю ту же страницу, я получаю «viewExpiredException». Это потому, что фильтр работал хорошо, он обошел перенаправление на invalidSessionUrl, но, так как сеанс истек в любом случае, я получаю это исключение, пытаясь повторно отрисовать ту же страницу.
Если я запрашиваю любую другую незащищенную страницу после истечения времени ожидания сеанса, он работает хорошо, он перенаправляет на страницу правильно, и я не получаю исключение viewExpiredException.
Кто-нибудь знает, как это решить?
Заранее спасибо.