2010-07-21 69 views
4

我正在嘗試爲我的Java EE/JSF2應用程序實現適當的註銷。從支持bean導航到外部URL?

它需要兩兩件事:

  1. 我需要從JAAS註銷和無效的會話
  2. 我則必須導航到外部URL火的SiteMinder註銷

在SiteMinder註銷URL(在策略服務器上配置 - >我無法更改它)位於我的應用程序上下文之外。例如。如果我的webapp網址是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; 
} 

但是,我無法找到一個JSF2/Primefaces組件,它可以調用註銷()然後打開外部URL。例如,如果我有:

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

然後onclick似乎並沒有被調用。

我嘗試的另一種方法是將外部URL放到註銷函數的末尾,讓它作爲導航字符串返回,但它不被識別(也嘗試使用「?faces-redirect = true」...)。

任何幫助,將不勝感激。

回答

3

您可以創建一個頁面logout.xhtml,所以代碼看起來就像這樣:

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

,並在頁面中加入:

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

非常感謝!刷新重定向解決了我的問題! – egbokul 2010-07-21 10:38:09

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"); 
} 

不需要具有元刷新的中介頁面。

+0

更好! ;-) 謝謝。 – egbokul 2010-07-23 08:22:37