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

Struts 1 Java Discussion :

déconnexion dans une jsp


Sujet :

Struts 1 Java

  1. #1
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    394
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 394
    Points : 73
    Points
    73
    Par défaut déconnexion dans une jsp
    bonsoir;

    j'ai une jsp d'authentification "login.jsp" qui me mène vers une jsp qui contient un menu"menu.jsp" ou chaque sous menu mène vers d'autre vues

    j'aimerais créer un button ou un lien qui me permet de faire la déconnexion dans chaque vue (jsp) de sorte de pouvoir retourner à la page de d'authentification "login.jsp" et si je clique sur le lien "précédent" du navigateur je peux pas retourner à la page ou j'étais

    c'est comme la déconnexion de la boite email
    est ce que quelqu'un a une idée comment faire ça ?

    merci

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 165
    Points : 205
    Points
    205
    Par défaut
    Salut,

    Tu peux utiliser le mécanisme de session. tu crée une session lors d'une connexion, après tu fais tes liens "déconnexions" sur tes pages pour ramener sur la page de login, et dans l'action correspondante, tu invalides la session.

    Ensuite, tu peux mettre un filtre en amont des toutes tes actions (jette un coup d'oeil du coté de la classe RequestProcessor, moi je fais comme ça) qui vérifie l'état de la session: si celle ci n'est pas valide, tu forward sur login.jsp, sinon tu laisse l'action s'exécuter.
    Ainsi, même sur un précédent, tu resteras sur ta page login.jsp

  3. #3
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    394
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 394
    Points : 73
    Points
    73
    Par défaut
    pouvez vous m'aidez plus eatherquake svp en me donnant une partie du code et plus de présicion ?
    par exemple
    comment je crée une session et comment je l'invalide et dans quelle actions ?
    sachant que l'action:
    qui affiche "login.jsp" c'est "main.do"
    et celle qui traite "login.jsp" et m'oriente vers le menu c'est "login.do"

    Ensuite, tu peux mettre un filtre en amont des toutes tes actions (jette un coup d'oeil du coté de la classe RequestProcessor, moi je fais comme ça) qui vérifie l'état de la session: si celle ci n'est pas valide, tu forward sur login.jsp, sinon tu laisse l'action s'exécuter.
    comment je mis ce filtre qui verifie si la session est valide je fais un forward vers login.jsp sinon je laisse l'action s'exécuter.

    merci de me répondre

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 165
    Points : 205
    Points
    205
    Par défaut
    Salut,

    Alors, dans l'action qui traite le login, si les information sont bonnes, tu peux créer une session:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    request.getSession(true).setAttribute("utilisateur", true);
    //a la place de true, tu peux mettre un objet contenant plein d'info sur l'utilisateur loggé, pour les réutiliser entre les requêtes...
    Dans l'action qui est appelé sur ton lien "se déconnecter", tu invalides la session :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HttpSession session = request.getSession();
    session.invalidate();

    Ensuite, tu peux verifier l'etat de ta session dans le filtre. Comme je te l'ai dit, ce filtre est une servlet qui sera executé en amont de chaque action, à chaque appel au serveur.
    Pour créer un tel filtre, ajoute dans le strut-config.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <controller>
      	<set-property property="processorClass" value="tonPaquetage.MyRequestProcessor"/>
    </controller>
    Ensuite, voici un code basique pour la classe MyRequestProcessor:
    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
    public class MyRequestProcessor extends RequestProcessor {
    @Override
    protected boolean processPreprocess(HttpServletRequest request, HttpServletResponse response) {
     
    //cas spécial, on laisse passer si l'utilisateur souhaite se logger
    if (request.getRequestURI().equals("login.do") {
    super.processPreprocess(request, response);
    }
     
    //si la session n'est pas presente, tu forward sur login
    if (session.getAttribute("utilisateur") == null) {
    request.getRequestDispatcher("main.do").forward(request, response);
    } else {//sinon tu laisses l'action s'executer normalement
    super.processPreprocess(request, response);
    }
    return false;
    }
    }
    Voilà...pour le request.getURI() je suis pas sur du tout hein, faudra que tu test...

  5. #5
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    394
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 394
    Points : 73
    Points
    73
    Par défaut
    voila ce que j'ai fait:
    dans l'action "main.do" qui initialise la vue"login.jsp" et l'affiche:
    j'ai déclaré ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    HttpSession session = request.getSession();
    session.invalidate();
    donc c'est dans cette action que j'invalide la session
    dans l'action "login.do" qui récupèr le nom du user conneté et affiche le menu j'ai fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     String username = loginForm.getUsername();
     
    		request.getSession(true).setAttribute("utilisateur", true);
    j'ai crée la class "MyRequestProcessor" dans le package des "actions"
    voici son code:
    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
     
    public class MyRequestProcessor extends RequestProcessor {
     
    	protected boolean processPreprocess(HttpServletRequest request, HttpServletResponse response) {
     
    //	cas spécial, on laisse passer si l'utilisateur souhaite se logger
    	if (request.getRequestURI().equals("login.do")) {
    	super.processPreprocess(request, response);
    	}
    	HttpSession session = request.getSession(); 
    //	si la session n'est pas presente, tu forward sur login
    	if (session.getAttribute("utilisateur") == null) {
    	try {
    		request.getRequestDispatcher("main.do").forward(request, response);
     
    	} catch (ServletException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	} catch (IOException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
    	} else {//sinon tu laisses l'action s'executer normalement
    	super.processPreprocess(request, response);
    	}
    	return false;
    	}
    	}
    et pr essayer j'ai déclaré dans une vue le lien de déconnexion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     <layout:link page="main.do"></layout:link>
    et qui me mène vers "main.do" pr invalider la session et pour afficher de nouveau la vue "login.jsp"

    mais maintenant quand je demande pr la 1ere fois "main.do"
    il ne rentre meme pas dans "main.do" car il ne m'affiche pas un "system.out.printl" que j'ai mis pr tester et il m'affiche une vue vide
    je crois que ça vient de la class"MyRequestProcessor" dans la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (session.getAttribute("utilisateur") == null) {
    	try {
    		request.getRequestDispatcher("main.do").forward(request, response);
    mais je sais pas pourquoi ??

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 165
    Points : 205
    Points
    205
    Par défaut
    Salut!

    ça m'a l'air pas mal ce que tu as fait... tu as un peu debuggé? tu rentres bien dans la classe requestProcessor lorsque tu veux afficher ta page de login? (et de manière générale, à chaque appel au serveur?)
    Que se passe t'il si tu fait juste un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.getRequestDispatcher("main.do").forward(request, response);
    Normalement, il ne devrait y avoir aucun problème avec cette ligne...l'action correspondante doit être appelé si elle est correctement déclaré dans le struts-config...
    Ah et pour le premier passage, la session sera nulle, donc le session.getAttribute("utilisateur") partira forcement en nullpointerexception...
    essaie donc de remplacer plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (session.getAttribute("utilisateur") == null)
    par
    et pour le getRequestURI, je crois qu'il te renvoi ton url depuis le contextpath de la webapp. Genre si ton contexte est "monAppliStruts", ça te renverra un truc du genre "/monAppliStruts/main.do" donc il y a peut être des ajustements à faire de ce coté là...
    Bon courage!

  7. #7
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    394
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 394
    Points : 73
    Points
    73
    Par défaut
    bonjour ,
    j'ai une question :
    on rentre dans la classe "requestProcessor " à chaque fois on fait appèl au serveur sans la demander??
    si c'est le cas j'ai l'impression qu'il ne rentre pas car j'ai mis dans cette class
    pour tester:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("je suis dans myrequest");
    mais rien ne s'affiche!!!

    peut etre la problème vient de la déclaration dans " struts-config..."
    voila ce que j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <controller>
      	<set-property property="processorClass" value="com.yourcompany.struts.action.MyRequestProcessor"/>
    </controller>
    je dois ajouter qlqchose?? et property="processorClass" elle sert à quoi
    je dois la déclarer quelque part??

    j'ai meme essayé de mettre comme vous m'avez suggéré just
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     request.getRequestDispatcher("main.do").forward(request, response);
    et j'ai mis
    mais toujours j'ai le meme problème il ne rentre pas dans l'action "main.do"
    qui affiche "login.jsp" et j'ai une page vide sans qu'il y une erreur

    je ne comprend pas !!

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 165
    Points : 205
    Points
    205
    Par défaut
    Salut,

    Ah d'accord, il semble y avoir un soucis, la classe MyRequestProcessor doit effectivement être appelé à chaque appel au serveur sans que tu n'ai rien à faire... (c'est tous l'intérêt justement: pouvoir y développer des fonctionnalités orthogonales à l'application, comme la gestion des sessions)

    Un petit rappel pour que tu comprennes: il n'y a qu'une servlet dans le framework Struts: ActionServlet qui récupére les requétes et les forwarde à tes classes Action (ou tes jsp)... C'est le contrôleur dans l'archi MVC de struts. A chaque requête, lorsque ActionServlet est appelé, elle crée en fait une instance de la classe RequestProcessor qui se charge de processer la requête(via la méthode process).
    Ce que je te propose de faire, c'est en fait de redefinire la méthode processPreprocess de cette classe qui est appelé au début de la méthode process. Cette méthode renvoit un booléen: true le process continue, et false, le process s'arrete.
    C'est dans cette méthode que tu ajoutes le traitement logique lié à la gestion de la session. En fait la méthode process est beaucoup plus riche que ça: tu peut rédefinir un tas de méthode pour tout un tas de traitement différent, en rédefinissant juste les méthodes adéquates qui t'interessent (processPath, processLocale, processForward...) struts fournissant une implémentation de base pour chacune d'entre elle.(design pattern Template)

    Donc pour ton problème:
    verifie bien le nom de ton paquetage, et la définition du controller dans le strus-config, écris la classe MyRequestProcessor, qui doit étendre RequestProcessor et redéfinir processPreprocess. Tout les flux doivent passer par cette méthode avant quoi que ce soit! Il faut que tu règles ce point avant quoi que ce soit.


    Un tuto très interressant sur le requestprocessor : http://www.onjava.com/pub/a/onjava/2...ingStruts.html (D'aprés ce tuto justement, Il faut placer l'élément <controller> APRES l'élément <action-mappings> dans le struts-config...chez moi c'est déjà le cas et toi?)

  9. #9
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    394
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 394
    Points : 73
    Points
    73
    Par défaut
    bon j'ai redéfinie la class "RequestProcessor" ainsi que la méthode "processPreprocess",je voulais aller pas à pas pour détecter l'origin de l'erreur j'ai fais ça:
    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 class MyRequestProcessor extends RequestProcessor
                 {
     
    	protected boolean processPreprocess(HttpServletRequest request, HttpServletResponse response) {
     
    	System.out.println("je suis dans MyRequestProcessor ");
     
    	HttpSession session = request.getSession(); 
     
    	if (session.getAttribute("utilisateur") == null)
    	 {
    		System.out.println("utilisateur est null");	
    }
     
    	else
    	{
    		System.out.println("utilisateur null");	
    	}
    	return false;
    	}
    }
    maintenant il rentre effectivement dans la class et il m'affiche:"utilisateur null"
    puisque la l'utilisateur est null dans la session pour la 1ere fois
    et quand j'ajout ça à la class:
    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
     
    if (session.getAttribute("utilisateur") == null)
    	 {
    		System.out.println("utilisateur est null");	
     
    			try {
    				request.getRequestDispatcher("main.do").forward(request, response);
    			} catch (ServletException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
     
    		}
    maintenant y'a l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:679)
    	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:461)
    	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:399)
    	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
    	at com.yourcompany.struts.action.MyRequestProcessor.processPreprocess(MyRequestProcessor.java:24)
    	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:184)
    	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
    	at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    sachant que l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    at com.yourcompany.struts.action.MyRequestProcessor.processPreprocess(MyRequestProcessor.java:24)
    désigne la ligne 24 de la class "MyRequestProcessor",celle que j'ai ajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    request.getRequestDispatcher("main.do").forward(request, response);
    je ne comprend pas ??
    vous pouvez m'aider??

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 165
    Points : 205
    Points
    205
    Par défaut
    Salut,

    Il s'agit d'un StackOverflowError? Il est possible que tu fasses une boucle infinie en forwardant sur main.do, car le requestprocessor de cette action sera appelé et re-forwardera sur main.do, etc.... Je me souviens avoir eu ce problème.
    Essaie plutot de remplacer par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.getRequestDispatcher("login.jsp").forward(request, response);
    de façon à ne pas tourner en rond.

  11. #11
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    394
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 394
    Points : 73
    Points
    73
    Par défaut
    bonsoir,

    quand j'ai fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    request.getRequestDispatcher("login.jsp").forward(request, response);
    bien ,la vue login.jsp s'affiche sans qu'il rentre dans main.do (c'est elle qui doit normalement faire un forward vers login.jsp)
    ensuit quand je tape le username et le mot de passe normalement c'est l'action (login.do)qui doit etre exécuté mais c'est la "login.jsp" qui s'affiche
    de nouveau alors maintenant je tourne en rond vers "login.jsp"

    je ne comprend pas
    pourriez vous me dire pourquoi??

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 165
    Points : 205
    Points
    205
    Par défaut
    ah bah oui si tu laisses jamais à l'utilisateur la possibilité de créer une session
    Dans le code que je t'avais donné, au début de la méthode processPreprocess, il y avais ça de très important:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //cas spécial, on laisse passer si l'utilisateur souhaite se logger
    if (request.getServletPath().equals("/login.do") {
    return super.processPreprocess(request, response);
    }

  13. #13
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    394
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 394
    Points : 73
    Points
    73
    Par défaut
    salut;

    merci beaucoup "eatherquake" pour votre solution ça m'a bcp aidé

    mais j'ai juste une petite remarque:
    quand je suis dans une jsp et je clique sur le lien "déconnexion"
    je revient sur la page de login via l'action "main.do" (et c'est ce que je voulais avoir)
    mais quand je clique sur le botton "Précédent" du navigateur je revient vers cette jsp et quand je clique sur un botton qui nécessite l'éxecution d'une action il me mène vers "main.do" et ça veux dire qu'il fait réalement la déconnexion

    mais y'a pas un moyen :quand je clique sur le botton "Précédent" du navigateur de rester dans "main.do" sans revenir à la jsp ou on a fait la déconnexion,comme la déconnexion de l'hotmail(on revient pas à notre boite)

    merci

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 165
    Points : 205
    Points
    205
    Par défaut
    Normalement, si tu fait précédent, le serveur est à nouveau appelé non? (ou alors uniquement appelé s'il y a eu soumission de formulaire...je sais pas trop) et dans ce cas tu repasses dans le requestProcessor qui constate que la session est invalide et te renvoi vers login.jsp...

    Donc si tu es sur login.jsp, que tu viens juste de te deloggué et que tu fait un précédent, tu devrais rester (être redirigé) sur login.jsp....vérifie que lors du précédent, tu passes bien dans le requestProcessor quand même...là je suis pas sur du tout!

  15. #15
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    394
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 394
    Points : 73
    Points
    73
    Par défaut
    justement le serveur est uniquement appelé s'il y a eu soumission de formulaire donc je ne passe pas dans requestProcessor!!

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 165
    Points : 205
    Points
    205
    Par défaut
    Dans ce cas, moi je simulerai l'envoi d'un formulaire vide... tu mets le lien dans un formulaire et sur un onclick, tu fais un submit.
    il y a probablement plus simple et plus propre mais je connais pas...

Discussions similaires

  1. déconnexion dans une jsp
    Par cyclopsnet dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 27/08/2009, 15h53
  2. [ XML ][ XSL ][ JSP ] afficher du xml dans une JSP
    Par zozolh2 dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 17/07/2009, 21h34
  3. [jsp] include dynamique dans une jsp
    Par petitelulu dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 04/03/2005, 08h59
  4. navigation dans une jsp avec javascript
    Par petitelulu dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/11/2004, 19h55
  5. [struts][jsp]Inclusion dans une jsp
    Par GreenJay dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 17/06/2004, 12h43

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