나는이 JSF 봄 보안에 시간 제한 다음과 같은 문제 : 사용자가 invalidSessionUrl로 리디렉션되도록 요청 된 페이지가 고정 만하면 내가 sessionmanagement 필터를 정의했습니다JSF 봄 보안 세션 시간 초과 viewExpiredException
(즉, 인증 된 사용자에게만 허용 된 경우). 나는 스프링 시큐리티가 제공하는 세션 관리 필터에 넣어 사용자 정의 코드는 다음과 같습니다
는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 (요청)는"요청 된 페이지를 반환이 방법 :
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를 반환합니다 (나는 access="isAuthenticated()"
속성을 갖는 XML 보안 설정 파일의 intercept-url 요소를 고려하여 IF를 사용하여 검사합니다) :
public static boolean paginaAutenticada (String pagina) {
if (pagina.startsWith("/faces/paginas/administracion/") || pagina.startsWith("/faces/paginas/barco/")) {
return true;
}
return false;
}
이 솔루션은 작동하지만, 그것은 단지 하나의 문제가있다 : 나는 세션 제한 시간이 만료 될 때까지 페이지에서 대기 체류 브라우저를두면
을하고 난 후, 나는 "viewExpiredException를 얻을, 같은 페이지를 요청 ". 이것은 필터가 잘 작동했기 때문에 invalidSessionUrl로 리다이렉션을 건너 뛰었지 만 세션이 만료 되었기 때문에 같은 페이지를 다시 렌더링하려고하는 예외가 발생합니다.
세션 제한 시간이 만료되었을 때 다른 보안되지 않은 페이지를 요청하면 제대로 작동하고 페이지로 올바르게 리디렉션되며 viewExpiredException을받지 못합니다.
누구든지이 문제를 어떻게 해결할 수 있는지 알고 있습니까?
미리 감사드립니다.
'invalidSessionUrl 로의 리다이렉션을 건너 뛰었지 만 세션이 만료되었으므로 동일한 페이지를 다시 렌더링하려고하는 예외가 발생합니다. '나는 이것이 무엇을 의미하는지 이해하지 못합니다. invalidSessionUrl을 다시 렌더링 할 때 ViewExpiredException이 발생한다고 말하는 것입니까? –
왜 자신 만의 세션 관리 필터를 작성하고 있습니까? 스프링 보안은이 기능을 즉시 사용할 수있게합니다. 다음을 Spring XML 설정에 추가하십시오. ... session-management> ' –
첫 번째 코멘트에 답하십시오 : 'invalidSessionUrl에 리다이렉션을 건너 뛰었지 만 세션이 만료되었으므로 같은 페이지를 다시 렌더링하려고 시도합니다.' 타임 아웃이 발생했을 때 브라우저가 보여주고있는 보안되지 않은 페이지를 다시 렌더링하면 "viewExpiredException"이 발생합니다. 이것은 세션이 만기 되었기 때문에 JSF가 페이지 뷰를 빌드 할 수 없기 때문에 발생합니다. Spring Security는 페이지가 안전하지 않기 때문에 세션 관리 필터를 건너 뛰지 만, JSF가 페이지를 다시 렌더링하려고 시도 할 때 예외를 throw합니다. – choquero70