IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

GWT et Vaadin Java Discussion :

[Filtre Servlet] Deconnexion automatique


Sujet :

GWT et Vaadin Java

  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2005
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 240
    Par défaut [Filtre Servlet] Deconnexion automatique
    Bonjour,

    Sut une appli gwt je voudrais pouvoir deconnecter automatiquement les utilisateurs dont le sessionhttp a expirée.

    Pour ça j'ai mis dans la session une variable "user" qui contiens l'utilisateur connecté et si cette variable est null je voudrais rediriger l'utilisateur vers une servlet "deconnect" qui se charge de fermer toutes les connexions.

    Pour réalisé ça, je mets un filtre sur mon remote servlet et donc à chaque appel il y a le test sur l'utilisateur qui se fait puis un sendRedirect le cas échéant.

    Le Code qui gère ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {
    		HttpServletRequest request = (HttpServletRequest) arg0;
    		HttpServletResponse response = (HttpServletResponse) arg1;
    		HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(response);
    		System.out.println("DeconnectFilter.doFilter()");
    		if(request.getSession().getAttribute("user") == null) {
    			System.out.println("DeconnectFilter.doFilter() REDIRECTION !!!!!");
    			wrapper.sendRedirect("deconnect?forcedeconnect=1");
    		} 
    		arg2.doFilter(arg0, wrapper);
    	}

    Je vois bien le message "REDIRECTION" mais après plus rien et l'utilisateur n'est pas redirigé mais je n'ai aucune exception, rien...

    Comment je peux rediriger mon utilisateur?
    Merci d'avance...

    P.S. j'utilise un 'HttpServletResponseWrapper' car je l'ai vu sur des forums mais j'ai aussi essayer avec le HttpResponse mais c'est exactement la même chose...

  2. #2
    Membre éclairé
    Inscrit en
    Novembre 2005
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 240
    Par défaut
    je continue mes investigations, mais sans résultats...

    J'ai modifié le code de mon filtre :

    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
     
    	public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {
    		HttpServletRequest request = (HttpServletRequest) arg0;
    		HttpServletResponse response = (HttpServletResponse) arg1;
    		HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(response);
     
     
     
    		System.out.println("DeconnectFilter.doFilter()");
    		if(request.getSession().getAttribute("user") == null) {
    			System.out.println("DeconnectFilter.doFilter() REDIRECTION !!!!!");
    			try{
    //				response.sendRedirect("index.jsp?forcedeconnect=1");
    				request.getRequestDispatcher("index.jsp?forcedeconnect=1").forward(arg0, arg1);
    			}catch (Exception e) {
    				e.printStackTrace();
    			}
    		} else {
     
    		}
    		arg2.doFilter(arg0, wrapper);
    	}
    et dans le web.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	<filter-mapping>
    		<filter-name>deconnectFilter</filter-name>
    		<url-pattern>/tools</url-pattern>
     
    		<dispatcher>REQUEST</dispatcher>
    		<dispatcher>FORWARD</dispatcher>
    		<dispatcher>INCLUDE</dispatcher>
    		<dispatcher>ERROR</dispatcher>
    	</filter-mapping>
    et malheureusement rien ne change...
    C'est à dire que les traces dans ma console sont bonnes et cohérentes mais que la redirection que doit voir l'utilisateur ne se fait pas...

    Si je trouve quelquechose, je le posterais ici, mais si quelqu'un a déjà eu ce genre de soucis, je suis preneur !

    (là j'en suis à me demander si ecrire le code javascript dans la réponse ne serait pas plus rentable...)

  3. #3
    Membre éclairé

    Inscrit en
    Août 2002
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Août 2002
    Messages : 302
    Par défaut
    Bonjour,
    Personnellement j'ai opté pour une méthode bcp plus simple. Dans chaque méthode serveur je vérifie l'état de la variable de session "user", si cette variable est vide je renvoie une exception de type particulier qui sera récupérée coté client dans la méthode onfailure de l'appel asynchrone et là je fais une redirection coté client. Je sais pas si c'est une bonne manière de faire mais ça a bien répondu à mon besoin.

  4. #4
    Membre éclairé
    Inscrit en
    Novembre 2005
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 240
    Par défaut
    Citation Envoyé par nannous Voir le message
    Bonjour,
    Personnellement j'ai opté pour une méthode bcp plus simple. Dans chaque méthode serveur je vérifie l'état de la variable de session "user", si cette variable est vide je renvoie une exception de type particulier qui sera récupérée coté client dans la méthode onfailure de l'appel asynchrone et là je fais une redirection coté client. Je sais pas si c'est une bonne manière de faire mais ça a bien répondu à mon besoin.
    J'y ai bien entendu pensé, mais je suis un peu fainéant et j'ai pas très envie de me retaper tous les appels serveurs
    C'est d'autant plus vrai que j'ai à côté d'autres applications à qui je pourrais implémenter ça....

    Sans compter que je ne comprends pas pourquoi cela ne marche pas et j'aimerais bien comprendre aussi...

  5. #5
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut
    Ce qui n'est pas clair dans ton message, c'est si tu utilises le RPC de GWT ?

    Et si c'est le cas, ton filtre est en amont ?

    De plus, le moyen le plus propre de réagir à une expiration de la session, c'est d'utiliser un HttpSessionListener.

  6. #6
    Membre éclairé
    Inscrit en
    Novembre 2005
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 240
    Par défaut
    Citation Envoyé par benwit Voir le message
    Ce qui n'est pas clair dans ton message, c'est si tu utilises le RPC de GWT ?

    Et si c'est le cas, ton filtre est en amont ?

    De plus, le moyen le plus propre de réagir à une expiration de la session, c'est d'utiliser un HttpSessionListener.
    Oui j'utilise le RPC de gwt, la servlet qui est filtrée est bien celle qui hérite de RemoteServlet.
    Après j'utilise déjà un SessionListener qui lui s'occupe de fermer les connexions ouvertes (notamment avec la BD).
    Moi ce que je cherche à faire avec le filtre c'est simplement pouvoir rediriger l'utilisaateur vers une autre page afin qu'il se re-connecte.

    Merci de vos réponses...

  7. #7
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut
    Ce qui me dérange dans cette approche, c'est que la servlet du RPC de GWT :
    1) decode la requête.
    2) appel la méthode de ton service en lui passant les paramètres décodés
    3) récupère le résultat de cette méthode et l'encode dans le contenu de la réponse

    Ton filtre est en amont de 1)

    Dans le cas normal, il n'a aucune incidence sur la requête rpc (c'est transparent pour elle dans la mesure où tu ne bidouilles pas les données de la requête ou de la réponse)

    Mais que se passe t'il dans le cas où tu ne veux pas poursuivre le traitement rpc, si tu veux t'arréter avant 1), ce que tu fais en faisant une redirection dans ton filtre, n'est-ce pas ?

    Comment va réagir gwt côté client ?
    a) Il ne recevra jamais de réponse de son appel de service rpc ?
    b) Il reçoit en réponse la page de redirection mais elle n'est pas à son goût (il s'attend à une réponse gwt où l'objet de retour de ta méthode de service aura été encodé) ?

    au lieu d'un filtre, pourquoi dans ton service, tu ne fais pas un test et tu n'envoi pas une réponse gwt compatible que ton client saura interpréter comme "session terminée) ?

  8. #8
    Membre éclairé
    Inscrit en
    Novembre 2005
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 240
    Par défaut
    Ce qui reviens à faire ce que nannous disait... Je vais devoir m'y résoudre, je préferrais éviter car ça reviens à revoir quasiment chaque méthodes...

    j'ai aussi essayer de faire une petite variante, c'est à dire qu'au lieu de rediriger, je levée un IOException pour le forcer à passer dans le onFailure
    et gérer l'exception la dedans, mais non rien n'y fais...


    Si je suis parti sur ce genre de méthode, c'est simplement car je la trouvais plus "propre" que de mettre un if sur chaque méthode, c'est aussi par curiosité, et aussi par un peu de manque de courage de revoir chaque méthode une a une...
    Surtout que j'ai d'autre application dans lesquelles je vais devoir revoir ce truc là.

    Merci pour vos conseils...

  9. #9
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut
    Je suis bien conscient des contraintes que ça peut imposer, c'est pour cela que personnellement, je n'utilise qu'un service RPC global qui joue le rôle de dispatcher et confie le travail effectif à des actions (MVC hiérarchique).

    L'idée de ton exception n'est pas mauvaise. Regarde ce post, il a été confronté au problème d'envoi d'exception.

    3 Solutions possibles pour minimiser l'écriture de tests dans chaque méthodes :

    1. Déclencher une exception (on doit pouvoir y arriver mais je n'ai jamais essayé)
    2. Utiliser comme moi un modèle hiérarchique où le service RPC joue le rôle de dispatcher.
    3. Côté serveur, essayer d'avoir le code de test à un seul endroit :
      • utiliser la relation client (au sens objet) :
        les servlets d'implémentations des services déléguent ce traitement de test à un objet fait pour cela (créer un singleton)
      • utiliser l'héritage :
        les servlets d'implémentations des services Service1Servlet, Service2Servlet, ... étendent une servlet abstraite RPCServiceServlet qui étend elle même RemoteServiceServlet de GWT. Dans RPCServiceServlet, tu crées une méthode de test qui sera appelée dans les méthodes de tes services Service1Servlet, Service2Servlet, ... . Tu n'y couperas pas mais le code est à un seul endroit.



  10. #10
    Membre éclairé
    Inscrit en
    Novembre 2005
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 240
    Par défaut
    Moi aussi je n'utilise qu'un seul service rpc...

    Donc, je vais faire une méthode qui teste la session et appeller cette méthode à chaque appel de mon service. et oublier cette histoire de filtre qui n'a pas l'air de fonctionner pour cette application...

    Merci...

Discussions similaires

  1. Démarrage Filtre / Servlets
    Par denisC dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 31/10/2007, 17h17
  2. Deconnexion automatique ?
    Par Tigrounette dans le forum JDBC
    Réponses: 4
    Dernier message: 07/09/2007, 10h34
  3. Réponses: 6
    Dernier message: 12/07/2006, 13h54
  4. [Sécurité] timout et déconnexion automatique
    Par gege19 dans le forum Langage
    Réponses: 1
    Dernier message: 03/07/2006, 14h24
  5. [Servlet]Envoi automatique de mails d'alerte
    Par spk4ever dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 11/05/2006, 14h06

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