从支持bean导航到外部URL?

我正在尝试为我的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组件。 例如,如果我有:

 [Logout] 

然后onclick似乎没有被调用。

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

任何帮助,将不胜感激。

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

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

并在页面中添加:

  

您也可以使用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"); } 

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