0

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

注销链接:

<h:form>
    <h:panelGroup id="loginout">
        <h:outputText value="#{todoController.loggedInUser}" />
        <h:commandLink value="logout" action="#{todoController.logout}" />
    </h:panelGroup>         
</h:form>

注销代码:

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";
}
4

1 回答 1

6

如果结果无效,就会发生这种情况。login.html似乎不是 JSF 页面,因此 JSF 导航将失败。

你想ExternalContext#redirect()改用。

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

请注意,上面还演示了一种更类似于 JSF 的方式来使会话无效。每当您需要javax.servlet.*从 JSF 底层获取原始 API 时,您应该始终问自己两次:“真的没有 JSF 提供的 API 吗?”

于 2011-06-27T06:27:33.020 回答