我的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";
}
如果结果无效,就会发生这种情况。login.html
似乎不是JSF页面,所以JSF导航将失败。
您希望改用ExternalContext#redirect()
。
public void logout() throws IOException {
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
ec.invalidateSession();
ec.redirect("../login.html");
}
请注意,上面还演示了一种更具JSF风格的使会话无效的方法。每当您需要从JSF引擎罩下提取原始javax.servlet.*
API时,您总是应该问自己两次:"是否真的有没有JSF提供的API?"