2012-07-21 3 views
1

로그 아웃 버튼을 클릭하면 사용자를 시작보기로 리디렉션하고 싶습니다. 로그 아웃이 올바르게 완료되고 시작보기가 요청 된 후 사용자에게 로그인 페이지가 표시됩니다. 지금까지는 그렇게 좋았습니다. 시작 화면이 보호되고 로그인 페이지로 리디렉션되는 위상 수신기로 가로 채기 때문에 내가 원하는 것입니다.로그 아웃 후 리디렉션이 JSF2 탐색 규칙에서 작동하지 않습니다.

로그 아웃 동작 :

public String logout() { 

    FacesContext context = FacesContext.getCurrentInstance(); 
    ExternalContext externalContext = context.getExternalContext(); 

    // invalidate session 
    Object session = externalContext.getSession(false); 
    HttpSession httpSession = (HttpSession) session; 
    httpSession.invalidate(); 

    // let the navigation rule decide where to go... 
    return null; 
} 

얼굴 탐색 규칙 :

<navigation-rule> 
    <navigation-case> 
     <from-action>#{loginBean.logout}</from-action> 
     <to-view-id>/faces/index.xhtml</to-view-id> 
     <redirect /> 
    </navigation-case> 
</navigation-rule> 

ForceLoginListener :

는 사용자에게 표시되는 URL입니다
@Override 
public void beforePhase(PhaseEvent event) { 

    FacesContext context = FacesContext.getCurrentInstance(); 

    // extract view id from original request 
    String viewId = context.getViewRoot().getViewId(); 

    if (// viewId is an 'protected' view AND not logged in //) { 

     Application app = context.getApplication(); 

     // redirect to the login view 
     ViewHandler viewHandler = app.getViewHandler(); 
     UIViewRoot viewRoot = viewHandler.createView(context, Constants.LOGIN_VIEW); 
     context.setViewRoot(viewRoot); 

    } 

} 

@Override 
public void afterPhase(PhaseEvent event) { 
} 

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

내가 지금 가지고있는 문제가 있음 시작보기 또는 로그인보기가 아니라 사용하기 바로 전에 활성화 된보기입니다 r 로그 아웃 버튼을 눌렀습니다.

탐색 규칙의 리디렉션이 다른 모든 내비게이션의 경우처럼 트릭을 수행해야한다고 생각했지만이 경우에는 작동하지 않습니다. 아무도 왜 그런 생각을 갖고 있니? 사전에

감사합니다.

+0

PhaseListener를 추가해야하는 이유가 없습니다. 로그 아웃없이 사용해 보셨습니까? 어떤 차이가 있니? –

+0

PhaseListener는 '보호 된'페이지에 대한 요청을 차단합니다. 로그 아웃이 아닙니다. 요청 흐름은 다음과 같습니다. 일부 pageX가 표시되고, 로그 아웃 버튼, 탐색 규칙을 통해 색인으로 리디렉션, 위상 수신기가 로그인보기를 가로 채고 설정합니다. 여기서 흐름이 멈 춥니 다. 브라우저가 위치 필드에 색인을 표시한다고 가정했지만 여전히 pageX가 작성되었습니다. – Joysn

답변

1

귀하의 이상을 ForceLoginListener 접근 방식은 보통 servlet filter으로 대체해야합니다.

+0

글쎄, 나는이 청취자를 "JSF 2 API 및 JBoss Seam 시작"이라는 책에서 가져 왔으므로 유효한 접근 방식이라고 생각했습니다. 이제 로그인 페이지로 리디렉션되는 필터로 변경되었습니다. – Joysn

+0

JSF 및 컨테이너 관리 보안에서 폼 기반 로그인을 사용하는 방법은 무엇입니까? JBoss에 보안 도메인과 로그인 모듈을 추가하고 cfg를'web.xml '에 추가하고 JSF 폼을 j_security_check 등으로 구현할 수 있다고 생각했습니다. 컨테이너가 인증을 처리 할 때 응용 프로그램에서 필요한 사용자 및 역할/그룹 정보를 어떻게 다시 얻을 수 있습니까? 나는 필요한 모든 것을 처리하는 Authenticator EBJ와 UserSession bean을 구현했다 ... – Joysn

+0

그리고 그 접근법으로 인증서 기반 로그인을 어떻게 추가 할 수 있는가? 올바른 인증서 기반 로그인이 컨테이너에서 지원된다는 것을 알았지 만 응용 프로그램에 필요한 정보를 얻으려면 어떻게해야합니까? – Joysn

0

정말 귀하의 경우 정확히 무슨 일이 일어나고 있는지 이해하지 않지만, 당신은 단지 externalContext를 사용하여 리디렉션하여 로그 아웃 작업을 변경 및 탐색 규칙에 모든 소란 제거 할 수 :

public void logout() throws IOException { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    ExternalContext externalContext = context.getExternalContext(); 

    // invalidate session 
    Object session = externalContext.getSession(false); 
    HttpSession httpSession = (HttpSession) session; 
    httpSession.invalidate(); 

    // redirect to your login view: 
    externalContext.redirect(Constants.LOGIN_VIEW); 
} 
+0

xhtml 페이지가 브라우저로 직접 전송되므로 리디렉션이 JSF 렌더링을 통과하지 못하는 것 같습니다. 그리고 페이지가 발견되도록 externalContext.getRequestContextPath()를 추가해야했습니다. – Joysn

+0

음 ... xhtml 콘텐츠가 브라우저로 전송되는 경우 'web.xml'의 매핑에 일부 잘못 구성되었을 수 있습니다. 'web.xml '에 faces 서블릿 매핑이 어떻게되어 있습니까? – elias

+0

나는 그 행동이 어떻게되어야한다고 생각한다. Constants.LOGIN_VIEW에는 "/faces/login.xhtml"만 포함되어 있기 때문에 일반적으로 UIViewRoot와 컨텍스트를 사용하여 viewRoot를 설정 했으므로 멋지게 작동합니다. 물론, web.xml에서 Faces 서블릿에 매핑 한 .jsf로 끝나는 다른 URI를 추가 할 수 있습니다. 하지만 질문은, 왜 내가 세션을 무효화하고 실제로 작동하는 로그인 페이지로 리디렉션하려고 할 때를 제외하고 모든 경우 탐색 케이스의 리디렉션이 작동하는지입니다. 브라우저 위치 필드에는 이전 URL 만 표시됩니다. 그저 외관상의 문제 일 뿐이지 만 어쨌든 재미있는 것 같습니다 :) – Joysn

관련 문제