2012-05-04 6 views
0

사용자가 로그인했는지 여부를 확인하고 그렇지 않은 경우 로그인 페이지로 리디렉션하는 서블릿 필터를 구현했습니다. 이 검사를 필터로 사용하는 이유는 로그인 페이지가 web.xml의 FROM auth-method를 사용하여 다른 컨텍스트 루트가있는 다른 웹 응용 프로그램에있는 페이지로 리디렉션 할 수없는 다른 webapp에 존재하기 때문입니다 (참고, weblogic 11g 사용하고 있습니다).JSF 2.0 - 사용자가 로그인하지 않은 경우 확인 및 리디렉션

내가 겪고있는 문제는 버튼처럼 ajaxified 구성 요소가있을 때 서블릿 필터가 사용자를 리디렉션 할 수 없다는 것입니다. 즉, 그들이 있던 페이지에서 오른쪽으로 뒤로 감습니다.

로그인 한 수표를 작성하는 다른 방법이 있습니까?

+0

위상 수신기가 더 적절합니까? – BestPractices

+0

관련 항목 : http://stackoverflow.com/questions/9305144/using-jsf-2-0-facelets-is-there-a-way-to-attach-a-global-listener-to-all-ajax/9311920 # 9311920 – BalusC

답변

2

서블릿 필터를 RESTORE_VIEW 단계 이전에 실행되는 JSF 2.0 단계 수신기로 다시 구현했습니다. 로직을 Phase Listener로 옮김으로써 AJAX 요청에 대한 리다이렉션을 처리하는 JSF의 기능을 이용할 수있었습니다. 기본적으로 JSF 2.0은 적절한 AJAX 응답을 생성하여 클라이언트 측에서 리디렉션을 발생시킵니다. 사용자가 로그인하지 않은 경우 명확하게하기 위해,이 메커니즘은 AJAX와 비 AJAX 요청에 대한 리디렉션을 수행 할 수있다 특히

, 그것은 다음과 같은 응답이 다시 전송됩니다.

<?xml version="1.0" encoding="utf-8"?> 
<partial-response> 
    <redirect url="/contextpath/faces/ajax/redirecttarget.xhtml"> 
    </redirect> 
</partial-response>" 

코드를 들어 위상 청취자 :

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

public void afterPhase(PhaseEvent event) 
{ 
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); 
    HttpSession session = (HttpSession)ec.getSession(false); 

    if (session==null || session.getAttribute(IS_LOGGED_IN_INDICATOR) == null) 
    { 
     try 
     { 
      ec.redirect(LOGIN_PAGE_URL); 
     } 
     catch(IOException e) 
     { 
      // log exception... 
     }   
    } 
} 
+1

PhaseListener는 JSF가 아닌 요청에는 영향을주지 않습니다. 따라서 JSF 이외의 리소스를 확보 한 경우에도 확인되지 않습니다. 필터에서 작업을 복제하거나 필터에서 전체 작업을 수행해야합니다. – BalusC

관련 문제