我在使用 JSF 的 Spring Security 中的超时存在以下问题:
我已经自定义了会话管理过滤器,以便只要请求的页面是安全的(即,如果它只允许经过身份验证的用户),用户就会被重定向到 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进行检查,考虑到我的xml安全配置文件的intercept-url元素具有属性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。
任何人都知道如何解决这个问题?
先感谢您。