1

当他单击注销按钮时,我想将用户重定向到开始视图。注销已正确完成,并且在请求开始视图后,会向用户显示一个登录页面。到目前为止一切顺利,这是我想要的,因为开始视图受到保护,并且我使用重定向到登录页面的阶段侦听器进行拦截。

注销操作:

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>

强制登录监听器:

@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;
}

我现在遇到的问题是用户可见的 URL 不是开始视图也不是登录视图,它是在用户按下注销按钮之前处于活动状态的视图。

我认为导航规则中的重定向应该像我所有其他导航案例一样发挥作用,但在这种情况下它不起作用。有人知道为什么吗?

提前致谢。

4

2 回答 2

1

您的奇怪ForceLoginListener方法需要替换为普通的servlet 过滤器

于 2012-07-23T22:23:44.687 回答
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);
}
于 2012-07-22T01:35:34.463 回答