2009-06-23 9 views
18

Cette question est liée à mon autre question "How to redirect to Login page when Session is expired in Java web application?". Voici ce que je suis en train de faire:Gestion de 'session expirée' dans l'application Web JSF, s'exécutant dans JBoss AS 5

  1. J'ai une application Web JSF en cours d'exécution sur JBoss AS 5
  2. Lorsque l'utilisateur est inactif pendant, disons 15 minutes, je dois déconnecter l'utilisateur et le rediriger vers la page de connexion, s'il essaie d'utiliser l'application après l'expiration de la session. Par conséquent, comme suggéré dans 'JSF Logout and Redirect', j'ai implémenté un filtre qui vérifie la condition d'expiration de la session et redirige l'utilisateur vers une page session-timed-out.jsp, si la session a expiré.
  3. J'ai ajouté SessionExpiryCheckFilter au-dessus de toutes les autres définitions de filtre dans web.xml, de sorte que mon contrôle d'expiration de session reçoive toujours le premier hit.

Maintenant vient le défi auquel je fais face. Comme j'utilise JBoss AS, lorsque la session a expiré, JBoss me redirige automatiquement vers la page de connexion (notez que le filtre de vérification d'expiration de session n'est pas appelé). Ainsi, après que je me connecte, mon SessionExpiryCheckFilter intercepte la demande, et il voit qu'une session est disponible. Mais, il jette l'exception javax.faces.application.ViewExpiredException: viewId:/mypage.faces - View /mypage.faces could not be restored.

Avez-vous déjà rencontré ce problème? Des idées pour résoudre ce problème?

+0

Utilisez-vous Seam? –

+0

Non. Je n'utilise pas Seam. – Veera

+0

Utilisez-vous des Facelets ou des JSP? – mtpettyp

Répondre

15

L'approche suivante fonctionne pour moi. Notez que vous devez utiliser la redirection taglib de base JSTL et non la redirection jsp pour que cela fonctionne (car le fichier jsp expire également).

Dans votre FacesConfig.xml vous mettre:

<error-page> 
    <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
    <location>/sessionExpired.jsf</location> 
</error-page> 

sessionExpired.jsp:

<%@page contentType="text/html" pageEncoding="UTF-8"%> 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd"> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 

<c:redirect url="/login.jsf" /> 

Vous pouvez également utiliser cette approche pour d'autres types d'erreur ou des exceptions. Par exemple, l'élément contient une correspondance entre un code d'erreur ou le type d'exception et le chemin d'une ressource dans l'application Web .:

<error-page> 
    <error-code>400</error-code> 
    <location>/400.html</location> 
</error-page> 

ou élément contient un nom de classe complet d'un type d'exception Java.

<error-page> 
    <exception-type>javax.servlet.ServletException</exception-type> 
    <location>/servlet/ErrorDisplay</location> 
</error-page> 
0

Je suggère d'écrire un écouteur de session en conjonction avec le filtre. Lorsque la session expire, vous pouvez créer un nouvel objet de session et définir une valeur de délai d'expiration sur le nouvel objet. Vérifiez simplement la valeur du délai d'expiration dans le filtre et redirigez le navigateur.

Voir http://www.java2s.com/Code/Java/Servlets/Servletsessionlistener.htm

3

Si vous utilisez Mojarra/Sun RI, vous voudrez peut-être essayer d'ajouter ceci à votre site Web.xml:

<context-param> 
    <param-name>com.sun.faces.enableRestoreView11Compatibility</param-name> 
    <param-value>true</param-value> 
</context-param> 

Cependant, sachez que ce n'est pas toujours la solution parfaite. Il cache le fait que l'utilisateur a perdu sa session.

+0

Ce n'est pas la meilleure solution. – Makky

1

Mettre en œuvre javax.faces.event.PhaseListener pour la restauration vue

@Override 
public void afterPhase(PhaseEvent event) { 
    FacesContext facesContext = event.getFacesContext(); 
    if(facesContext.getViewRoot()==null){ 
     try{ 
      facesContext.getExternalContext().redirect(HOME_PAGE); 
      facesContext.responseComplete(); 
     } catch (IOException e){ 
      e.printStackTrace(); 
     } 
    } 
} 

@Override 
public void beforePhase(PhaseEvent event) {} 

@Override 
public PhaseId getPhaseId() { 
    return PhaseId.RESTORE_VIEW; 
} 

registre faces-config.xml

0

J'ai essayé d'écrire un filtre pour elle, mais certains comment il ne fonctionnait pas pour moi , donc j'ai fait un alternatif pour cela.

Je l'ai fait comme ça dans chaque page que je ne veux pas l'utilisateur d'accéder sans connexion:

<f:view> 
    <h:dataTable value="#{userHome.validuser()}"/> 
    // my code 
<f:view/> 

Ceci appellera la fonction validuser() qui est dans ma session bean géré.

Maintenant c'est ma fonction. Lors de la connexion, j'insère déjà l'objet utilisateur dans la session.

public void validuser() 
{ 
    FacesContext context = FacesContext.getCurrentInstance(); 
    UserLogin ul = (UserLogin) context.getExternalContext().getSessionMap().get("userbean"); 

    if (ul == null) 
     try{ 
       context.getExternalContext().redirect("/HIBJSF/faces/LoginPage.xhtml"); 
       context.responseComplete(); 
     } 
     catch (IOException e) 
     { 
     e.printStackTrace(); 
     } 
} 

S'il y a une session, mais personne ne l'avait connecté, il vous amène à une page de redirection.

Questions connexes