如何在 JSF 2.0 中使会话失效?

问题描述 投票:0回答:4

在 JSF 2.0 应用程序中使会话失效的最佳方法是什么?我知道JSF本身不处理会话。到目前为止我能找到

private void reset() {
    HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
            .getExternalContext().getSession(false);
    session.invalidate();
}
  1. 这个方法正确吗?有没有办法不碰 ServletAPI?
  2. 考虑一个场景,其中
    @SessionScoped
    UserBean 处理 用户的登录-注销。我在同一个bean中有这个方法。现在 当我完成必要的数据库后调用
    reset()
    方法时 更新后,我当前的会话作用域 bean 会发生什么情况?自从 甚至bean本身也存储在
    HttpSession
session jsf-2 httpsession managed-bean session-scope
4个回答
126
投票

首先这个方法正确吗?有没有一种不接触ServletAPI的方法?

您可以使用

ExternalContext#invalidateSession()
使会话无效,而无需获取 Servlet API。

@ManagedBean
@SessionScoped
public class UserManager {

    private User current;

    public String logout() {
        FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
        return "/home.xhtml?faces-redirect=true";
    }

    // ...

}

我当前的会话作用域 bean 会发生什么?因为连 bean 本身都存储在 HttpSession 中吗?

它在当前响应中仍然可以访问,但在下一个请求中将不再存在。因此,在无效后触发重定向(新请求)非常重要,否则您仍会显示旧会话中的数据。可以通过在结果中添加

faces-redirect=true
来完成重定向,就像我在上面的示例中所做的那样。发送重定向的另一种方法是使用
ExternalContext#redirect()

public void logout() throws IOException {
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ec.invalidateSession();
    ec.redirect(ec.getRequestContextPath() + "/home.xhtml");
}

然而,在这种情况下,它的使用是有问题的,因为使用导航结果更简单。


13
投票
public void logout() {
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
}

0
投票

通过“正常”重定向,我最终得到了一个无法正常工作的登录表单(我重定向到的位置)。我最终对文档 href 进行了 JavaScript 更新。使用 OmniFaces 它看起来像这样:

if (!Faces.isAjaxRequest()) {
  throw new FacesException("Ajax request is required");
}
// ... Do logout from your security manager here (we use Shiro)
Ajax.oncomplete("document.location.href='" + url + "'");

-1
投票

前端代码是:

<h:form>
<h:commandLink action="#{userManager.logout()}">
       <span>Close your session</span>
</h:commandLink>
</h:form>

后端代码是:

public String logout() {
    HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
    if (session != null) {
        session.invalidate();
    }
    return "/login.xhtml?faces-redirect=true";  
}
© www.soinside.com 2019 - 2024. All rights reserved.