2010-07-21 4 views
4

J'essaie d'implémenter la déconnexion correcte pour mon application Java EE/JSF2.Accédez à l'URL externe à partir d'un bean backing?

Il faut deux choses:

  1. je dois déconnecter de JAA et invalider la session
  2. Je puis de naviguer vers une URL externe au feu SiteMinder fermeture de session

Le SiteMinder fermeture de session L'URL (configurée sur le serveur Policy -> Je ne peux pas le changer) est en dehors de mon contexte d'applications. Par exemple. Si l'URL de mon application Web est https://localhost:8080/sm/MyWebApp, l'URL de déconnexion est https://localhost:8080/anotherwebapp/logout.html.

Voici le code local actuel logout:

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

Et voici la propriété qui produit l'URL logout:

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

Cependant, je ne peux pas trouver un composant JSF2/Primefaces qui peut appeler déconnectez-vous() puis ouvrez l'URL externe. Par exemple, si j'ai:

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

alors onclick ne semble pas être appelé. Une autre façon que j'ai essayé était de mettre l'URL externe à la fin de la fonction de déconnexion pour qu'elle soit retournée comme une chaîne de navigation mais elle n'est pas reconnue (également essayée avec "? Faces-redirect = true" ...).

Toute aide serait appréciée.

Répondre

3

Vous pouvez créer une page logout.xhtml, de sorte que le code ressemblera à ceci:

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

et dans l'add page:

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

Merci beaucoup! Refresh-redirect a résolu mon problème! – egbokul

13

Vous pouvez aussi utiliser 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"); 
} 

Pas besoin d'une page intermédiaire avec un meta refresh.

+0

Encore mieux! ;-) Merci. – egbokul

Questions connexes