2010-03-05 6 views

답변

8

shouldFilter을 사용하십시오.

예.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { 
    if (((HttpServletRequest) request).getSession().getAttribute("user") == null) { 
     ((HttpServletResponse) response).sendRedirect("error.jsf"); // Not logged in, so redirect to error page. 
    } else { 
     chain.doFilter(request, response); // Logged in, so just continue. 
    } 
} 

여기 당신이 일반적으로 예상하는대로 User 세션 범위에 저장되어 있다고 가정. 세션 범위가 지정된 JSF 관리 Bean으로 user이라는 이름을 사용할 수 있습니다.

정상적인 GET 요청 중에는 "bean 작업"의 수단이 없으므로 탐색 규칙이 적용되지 않습니다. 또한 관리 빈이 생성 될 때 리디렉션을 수행하는 것은 작동하지 않습니다. 왜냐하면 정상적인 GET 요청 중에 관리 빈이 구성 될 때 응답이 이미 렌더링되기 시작했기 때문에 응답은 이 아닙니다. (IllegalStateException: response already committed 만 생성). PhaseListener는 실제로 JSF 단계에서 청취 할 필요가 없으므로 번거롭고 압도적입니다. "일반"HTTP 요청과 세션 범위에있는 특정 객체의 존재를 수신하기 만하면됩니다. 필터가 완벽하기 때문입니다. PhaseListener 시도에서

+0

위로 엄지. 이제는 특정 페이지에서만 트리거되도록이 내용을 조정해야합니다. –

+0

특정 페이지에 일반적인 'url-pattern'을 만들고이 필터를'web.xml'의'url-pattern'에 정확히 매핑하십시오. 예를 들면'/ secured/*'정도입니다. – BalusC

3

예 : 당신이 리디렉션을 수행 할 때

if(!isLoggedIn) { 
FacesContext.getCurrentInstance().getExternalContext().redirect(url); 
} 
+0

감사합니다 :). 네비게이션 규칙을 트리거하는 것이 편리 할 수 ​​있지만 이것이 불가능하다고 생각합니다. –

1

당신이 지정하는 PhaseListener를 사용할 수 있습니다.

1

:

FacesContext ctx = FacesContext.getCurrentContext(); 
ctx.getApplication().getNavigationHandler() 
    .handleNavigation(ctx, null, "yourOutcome"); 
+0

'FacesContext'는'FacesServlet'이 시작되기 전에'Filter'에서 아직 사용할 수 없습니다. – BalusC

+0

FacesContext는 언제 라이프 사이클 측면에서 나타 납니까? –

+0

전체 수명주기 동안 존재합니다. FacesServlet이 호출되기 전에 존재하지 않습니다. FacesServlet은 JSF 라이프 사이클을 시작합니다. – Bozho

관련 문제