4

我正在尝试为我的 Java EE / JSF2 应用程序实现正确的注销。

它需要两件事:

  1. 我需要从 JAAS 注销并使会话无效
  2. 然后我必须导航到外部 URL 以触发 Siteminder 注销

Siteminder 注销 URL(在策略服务器上配置 -> 我无法更改)在我的应用程序上下文之外。例如。如果我的 webapp URL 是https://localhost:8080/sm/MyWebApp那么注销 URL 是https://localhost:8080/anotherwebapp/logout.html

这是当前的本地注销代码:

public void logout() {
    System.out.println("Logging out...");
    HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
    try {
        request.logout();
    } catch (ServletException e) {
        e.printStackTrace();
    }
    HttpSession session = (HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(false);
    if (session != null) {
        session.invalidate();
    }
}

这是生成注销 URL 的属性:

public String getLogoutUrl() {
    HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
    String requestServer = request.getServerName();
    String requestScheme = request.getScheme();
    int serverPort = request.getServerPort();
    String logoutUrl = requestScheme + "://" + requestServer + ":" + Integer.toString(serverPort) + "/anotherwebapp/logout.html";
    return logoutUrl;
}

但是,我找不到可以调用 logout() 然后打开外部 URL 的 JSF2 / Primefaces 组件。例如,如果我有:

<h:outputLink value="#{authBean.logoutUrl}" onclick="#{authBean.logout()}">[Logout]</h:outputLink>

然后似乎没有调用 onclick。

我尝试的另一种方法是将外部 URL 放在注销函数的末尾,使其作为导航字符串返回,但无法识别(也尝试使用 "?faces-redirect=true"...)。

任何帮助,将不胜感激。

4

2 回答 2

13

您也可以只使用ExternalContext#redirect().

public void logout() throws ServletException, IOException {
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ((HttpServletRequest) ec.getRequest()).logout();
    ec.invalidateSession();
    ec.redirect("http://example.com/anothercontext/logout");
}

不需要带有元刷新的中间页面。

于 2010-07-22T17:42:39.030 回答
3

您可以创建一个页面 logout.xhtml,因此代码将如下所示:

public String getLogoutUrl() {
    return "/logout.jsf";
}

并在页面中添加:

<META HTTP-EQUIV="Refresh" CONTENT="0;URL=https://localhost:8080/anotherwebapp/logout.html">
于 2010-07-21T10:02:37.653 回答