logout commandLink将用户注销,但不更新页面

Dan*_*ana 0 jsf java-ee jboss6.x

我的JSF应用程序中有一个注销链接,使会话无效以将用户注销.它可以工作,但它不会将用户重定向到登录页面.它保持在同一页面上.如果我再次尝试访问同一页面,它会直接返回登录.我想要立即发生这种情况.

注销链接:

<h:form>
    <h:panelGroup id="loginout">
        <h:outputText value="#{todoController.loggedInUser}" />
        <h:commandLink value="logout" action="#{todoController.logout}" />
    </h:panelGroup>         
</h:form>
Run Code Online (Sandbox Code Playgroud)

注销码:

public String logout()
{
    System.out.println("testing logout");
    FacesContext fc = FacesContext.getCurrentInstance();
    ExternalContext ec = fc.getExternalContext();

    final HttpServletRequest r = (HttpServletRequest)ec.getRequest();
    r.getSession( false ).invalidate();

    return "../login.html?faces-redirect=true";
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 6

如果结果无效,则可能发生这种情况.login.html似乎不是一个JSF页面,因此JSF导航将失败.

你想要ExternalContext#redirect()改用.

public void logout() throws IOException {
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ec.invalidateSession();
    ec.redirect("../login.html");
}
Run Code Online (Sandbox Code Playgroud)

请注意,上面还演示了一种更加JSF的方法来使会话无效.每当你需要javax.servlet.*从JSF引擎盖下运输原始API时,你应该总是问自己两次:"这真的没有JSF提供的API吗?"