2013-04-24 7 views
0

일부 페이지에 대한 사용자 액세스를 제어하는 ​​PhaseListener가 있습니다. 사용자가 로그인하지 않은 경우 loginpage로 리디렉션됩니다.handleNavigation이 PhaseListener에서 작동하지 않습니다.

문제는 내 handleNavigation이 사용자를 리디렉션하지 않는다는 것입니다. 실행되지만 사용자를 리디렉션하지 않습니다.

사용자가 액세스 할 수없는 URL을 입력하면 메서드가 실행되지만 로그인 페이지로 리디렉션되지 않고 페이지가 열립니다.

무엇이 잘못 되었나요?

public class AuthorizationListener implements PhaseListener { 

    public void afterPhase(PhaseEvent event) { 

    FacesContext facesContext = event.getFacesContext(); 
    String currentPage = facesContext.getViewRoot().getViewId(); 

    boolean isLoginPage = (currentPage.lastIndexOf("login.xhtml") > -1); 
    if(isLoginPage) 
     return; 

    if(currentPage.indexOf("/rws/") != -1) 
    { 
     HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true); 
     Object currentUser = session.getAttribute("usuario"); 

     if (!isLoginPage && currentUser == null) { 
     NavigationHandler nh = facesContext.getApplication().getNavigationHandler(); 
     nh.handleNavigation(facesContext, null, "loginPage"); 
     } 
    } 
} 

public void beforePhase(PhaseEvent event) { 
    System.out.println("Hellow World"); 
} 

public PhaseId getPhaseId() { 
    return PhaseId.RENDER_RESPONSE; 
} 

} 

내 얼굴-설정 당신은 응답을 렌더링의 단계 이후 동안 코드를 실행하고

<navigation-rule> 
    <from-view-id>/*</from-view-id> 
    <navigation-case> 
    <from-outcome>loginPage</from-outcome> 
    <to-view-id>/login.xhtml</to-view-id> 
    </navigation-case> 
</navigation-rule> 

<lifecycle> 
    <phase-listener>br.com.testes.filter.AuthorizationListener</phase-listener> 
</lifecycle> 

답변

2

. 따라서 JSF가 응답을 렌더링하고 완료 한 이후입니다. 그 순간 전체 HTTP 응답은 이며 이미이 완료되어 웹 브라우저로 완전히 보내집니다.

이것은 반품의 요지입니다. 응답을 변경하기 위해 코드가 너무 늦었습니다.

대신보기 복원 단계를 수신하십시오. 또는 servlet filter을 사용하십시오. JSF 위상 수신기는 작업에 지나치게 어색한 도구입니다 (JSF 이외의 요청에는 영향을주지 않으며 JSF 요청 중에 최대 12 번까지 트리거됩니다). 서블릿 필터는 작업에 적합한 도구입니다. 이 답변에서 구체적인 예를 찾을 수 있습니다 : JSF page style missing when using login filter.

+0

나는 단지 당신의 [blog] (http://balusc.blogspot.com/2013/01/apache-shiro-is-it-ready-for-java-ee-6.html)를보고 있었고 여기 있다! – Apurv

+0

@Apurv : 시로 힌트에 감사드립니다. Shiro는 서블릿 필터도 사용하고 있습니다.) – BalusC

+0

감사합니다. 지금 오류가 표시됩니다. beforePhase 메서드를 사용하면 문제가 없습니다. – user1352652