Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Seam Java Discussion :

Timeout sur les requêtes Ajax


Sujet :

Seam Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    juillet 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : juillet 2007
    Messages : 75
    Points : 88
    Points
    88
    Par défaut Timeout sur les requêtes Ajax
    Hello.

    Petit resumé:
    AS: JBoss 4.2.3
    Seam: 2.2.0
    Richfaces 3.3.3 (Dans seam 2.2.0 qui est 3.3.1 donc j'ai remplacer manuellement les jar)

    Eclipse + Jboss tools, je crée un nouveau projet seam

    Je réduit le timeout de 30 à 1 min en ajoutant dans le web.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <session-config>
    	<session-timeout>1</session-timeout>
    </session-config>
    Je crée une nouvelle page sécurisé (besoin de se logger pour pouvoir y acceder) en ajoutant dans la balise <page> de test.page.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    login-required="true"
    Si j'essayé d’accéder directement à test.xhtml (une page protégé), il me redirige vers la page de login, tout vas bien.

    Dans test.xhtml j'ai un <s:link> vers une autre page sécurisé et un <h:selectOneMenu> qui filtre un <rich:dataTable> en ajax (genre en selectionnant 2010 dans le selectOneMenu, dans le tableau on fitre pour afficher que les résultats de 2010)

    J'affiche ma page test.xhtml et j'attend 1min le timeout (si j'attend pas ca marche normalement)

    Si je clique sur <s:link> il me redirige vers la page de login, je me logue et m'envoie directe vers l'autre page sécurisé. Parfait, rien à dire.
    Par contre quand je veux changer la valeur du filtre la requete ajax part en time out et ne me redirige pas vers la page de login comme le s:link.

    J'ai la page:



    et ca fait une belle erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    11:37:09,726 ERROR [lifecycle] JSF1054: (Phase ID: RESTORE_VIEW 1, View ID: ) Exception thrown during phase execution: javax.faces.event.PhaseEvent[source=com.sun.faces.lifecycle.LifecycleImpl@b0f24a]
    11:37:09,726 ERROR [Exceptions] handled and logged exception
    javax.servlet.ServletException: viewId:/protected/PersonneList.seam - View /protected/PersonneList.seam could not be restored.
    	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:270)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
    	at org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40)
    	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    	at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90)
    	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    	at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
    	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    	at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
    	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    	at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
    	at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
    	at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
    	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
    	at org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56)
    	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    	at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60)
    	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    	at org.jboss.seam.web.HotDeployFilter.doFilter(HotDeployFilter.java:53)
    	at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
    	at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182)
    	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:432)
    	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    	at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
    	at java.lang.Thread.run(Thread.java:662)
    Caused by: javax.faces.application.ViewExpiredException: viewId:/protected/PersonneList.seam - View /protected/PersonneList.seam could not be restored.
    	at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:186)
    	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
    	at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:104)
    	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
    	... 41 more
    Comment faire pour que les requetes ajax qui tombent en timeout renvoie sur la page de login comme le <s:link>

    Merci?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    juillet 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : juillet 2007
    Messages : 75
    Points : 88
    Points
    88
    Par défaut
    J'ai deja essayé en ajoutant dans le web.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     <context-param>
        <param-name>org.ajax4jsf.handleViewExpiredOnClient</param-name>
        <param-value>true</param-value>
      </context-param>
    mais ca ne change rien.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    juillet 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : juillet 2007
    Messages : 75
    Points : 88
    Points
    88
    Par défaut
    Si j'ajoute dans le web.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <context-param>
    	<param-name>com.sun.faces.enableRestoreView11Compatibility</param-name>
    	<param-value>true</param-value>
    </context-param>
    Lorsque qu'une session est expiré, il en crée une nouvelle.

    Lors d'une requete ajax en timeout, il me redirige bien vers la page de login, mais quand je me logue, il me redirige vers la bonne page (bonne url) mais elle n'affiche rien (blanche).

    URL de redirection envoyé apres le relogin c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://localhost:8080/SeamDemo/protected/PersonneList.seam?j_id12:j_id60=0&j_id12:j_id85=j_id12%3Aj_id85&j_id12=j_id12&AJAXREQUEST=_viewRoot&j_id12:j_id62=false&j_id12:j_id61=&j_id12:j_id14=org.jboss.seam.ui.NoSelectionConverter.noSelectionValue&javax.faces.ViewState=j_id3&cid=16
    Bref c'est tjs pas bon.

    Edit: c'est ce qui est expliqué dans la FAQ Seam par orden ici mais ca marche pas chez moi en tout cas.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    juillet 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : juillet 2007
    Messages : 75
    Points : 88
    Points
    88
    Par défaut
    Pareil avec le tuto de sniper, http://lmellouk.developpez.com/tutor...chfaces/#LIX-O

    Sauf que la bien sur, pas besoin de cliquer sur un composant ajax pour faire venir l'erreur, le poll s'en charge pour nous.
    Mais la modal ne s'affiche jamais et me renvoie sur la page Error Something bad happened :-(

    Le blabla de richfaces la dessus c'est la:
    http://docs.jboss.org/richfaces/late...rationHandling

    mais ca m'aide pas non plus.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    juillet 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : juillet 2007
    Messages : 75
    Points : 88
    Points
    88
    Par défaut
    Bon j'ai trouvé pour ne plus avoir de message d'erreur mais c'est tjs pas parfait.

    J'ai ajouté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <context-param>
    	<param-name>org.ajax4jsf.handleViewExpiredOnClient</param-name>
    	<param-value>true</param-value>
    </context-param>
    Dans mon web.xml

    Et j'ai crée un PhaseListener qui redirige vers la page de login si un session timeout est detecté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    package be.demo.session;
     
    import javax.faces.context.FacesContext;
    import javax.faces.event.PhaseEvent;
    import javax.faces.event.PhaseId;
    import javax.faces.event.PhaseListener;
    import javax.servlet.http.HttpServletRequest;
     
    import org.jboss.seam.annotations.Name;
    import org.jboss.seam.annotations.Observer;
    import org.jboss.seam.core.Events;
     
    @Name("sessionexpirationlistener")
    public class SessionExpirationListener implements PhaseListener {
     
        private static final long serialVersionUID = -6597389927741480262L;
     
        public PhaseId getPhaseId() {
    	return PhaseId.RESTORE_VIEW;
        }
     
        @Observer("org.jboss.seam.beforePhase")
        public void beforePhase(PhaseEvent event) {
    	if (event.getPhaseId() == PhaseId.RESTORE_VIEW) {
    	    HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext()
    		    .getRequest();
     
    	    if (request.getRequestedSessionId() != null && request.getSession().isNew()) {
    		Events.instance().raiseEvent("security.sessionExpired");
    		try {
    		    FacesContext.getCurrentInstance().getExternalContext().redirect("../login.seam");
    		} catch (Exception e) {
    		    e.printStackTrace();
    		}
    	    }
    	}
        }
     
        public void afterPhase(PhaseEvent event) {
    	// Rien a faire ici
        }
    }
    Les trucs nul c'est que aucun message pour prévenir pourquoi on à été redirigé vers la page de login, l'url est en dur dans le code et perte de la navigation et des données encodées...

    edit: le composant rich:fileupload tombe encore en erreur si il n'y a plus de session.

Discussions similaires

  1. [AJAX] Centraliser les requêtes AJAX afin d'avoir un seul appel
    Par Mike_69 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 29/03/2007, 17h51
  2. problème de doublon sur les requêtes
    Par laurent7474 dans le forum Oracle
    Réponses: 6
    Dernier message: 08/12/2006, 11h31
  3. Renseignements sur les requêtes
    Par Virgile59 dans le forum Access
    Réponses: 1
    Dernier message: 07/02/2006, 21h09
  4. Calcul de Statistics sur les requêtes
    Par Rahustro dans le forum Oracle
    Réponses: 3
    Dernier message: 17/01/2006, 07h19
  5. Optimisations mysql sur les requêtes SELECT: index
    Par leo'z dans le forum Débuter
    Réponses: 2
    Dernier message: 29/11/2003, 14h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo