0

Google을 통해 이미 검색했으며 stackoverflow에서 검색했지만 비슷한 문제는 찾을 수 없습니다.ExceptionHandlerWrapper의 handle() 메서드가 호출되기 전에 ViewExpiredException이 처리되었습니다.

내 프로젝트에서 나는 ViewExpiredException을 적절하게 처리하고 현재 세션이 시간 초과되었다는 사용자 정의 페이지를 사용자에게 보여줍니다. 이 훌륭한 작동하지만이 메시지가 사용자에게 표시되기 전에 뭔가 할 싶습니다. 실제로 저는 프론트 엔드 쪽과 백엔드쪽에 2 개의 다른 세션을 가지고 작업하고 있습니다. 따라서 아이디어는 현재 백엔드 세션이 시작될 때 새로운 백엔드 세션을 시작하지 않는 것입니다. doFilter 메서드 안에있는 동안 ViewExpiredException을 가져올 가능성이 있습니까? 그렇기 때문에 새로운 백엔드 세션을 시작할 필요가 없습니다. 아니면 다른 방법이 있습니까?

는 이미

FacesContext fc = FacesContext.getCurrentInstance(); 

를 통해 현재 컨텍스트를 가져 오기 위해 노력하지만 세션이 시간 초과하기 때문에 분명히 상황은 null입니다. ExceptionHandlerWrapper 내부에서 UnhandledExceptionQueuedEvents에 액세스 할 수 있지만 이전에는이 ​​정보가 필요하기 때문에 여기서는 도움이되지 않습니다.

나는 내 문제를 충분히 분명하게 만들었기를 바랍니다.

미리 도움을 청하십시오!

감사 세바스찬은

답변

1

일반적으로 ViewExpiredException는 세션 시간이 초과되는 동안 POST 요청이 발사 될 때 발생합니다.

boolean post = "POST".equals(request.getMethod()); 
boolean timedout = request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid(); 

if (post && timedout) { 
    // JSF will guaranteed throw ViewExpiredException when state saving is set to server. 
} 

을하지만이 가능한 모든 경우에 적용되지 않습니다 그래서,이 필터에해야한다. ViewExpiredException은 세션 시간이 초과되지 않은 경우에도 발생할 수 있습니다. 예를 들어, 클라이언트가 유효하지 않은 javax.faces.ViewState 매개 변수를 전달한 경우 또는 연관된보기가 기본적으로 15 개의보기를 보유 할 수있는 LRU 맵에서 프 i 된 경우. 그러나 이것은 FilterChain#doFilter()이 호출되기 전에 서블릿 필터에서 감지 할 수 없습니다. JSF 컨텍스트 안에 있어야한다. PhaseListener에서 백엔드 세션 생성 작업을 수행 할 수 있습니다. 예 : 적용 요청 값 적용 단계의 이전 단계에서 유효한 것으로 확인 된 경우에만 유효합니다. FacesServlet, 그것을 만들기위한 책임이있는 사람이, 그 시점에서 아직 호출되지 않았기 때문에 그런데

FacesContext 세션 시간이 초과 되었기 때문에하지 null 필터에 있지만. 필터는 서블릿보다 먼저 실행됩니다.

+0

이 설명에 대해 감사드립니다. – Sebastian

관련 문제