从支持bean导航到外部URL?

时间:2010-07-21 08:49:00

标签: java jsf jsf-2 primefaces siteminder

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

它需要两件事:

  1. 我需要从JAAS注销并使会话无效
  2. 然后,我必须导航到外部URL以触发Siteminder注销
  3. Siteminder注销URL(在策略服务器上配置 - >我无法更改)在我的应用程序上下文之外。例如。如果我的webapp网址为https://localhost:8080/sm/MyWebApp,则注销网址为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”...)。 / p>

    任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分: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");
}

无需具有元刷新的中介页面。

答案 1 :(得分:3)

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

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

并在页面中添加:

<META HTTP-EQUIV="Refresh" CONTENT="0;URL=https://localhost:8080/anotherwebapp/logout.html">