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
    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
    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
    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
    Pareil avec le tuto de sniper, http://lmellouk.developpez.com/tutoriels/jsf/richfaces/#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/latest_3_3_X/en/devguide/html/ArchitectureOverview.html#RequestErrorsAndSessionExpirationHandling

    mais ca m'aide pas non plus.

  5. #5
    Membre régulier
    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.

###raw>template_hook.ano_emploi###