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 :

Gestion d'une session avec RequestProcessor


Sujet :

Struts 1 Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 23
    Par défaut Gestion d'une session avec RequestProcessor
    Bonjour,

    me voici devant un problème de gestion de session.
    On m'a donné un tuto permettant de mettre en place un système de session avec test de connexion et de TIME OUT.

    Voilà ce que j'ai fait :

    j'ai d'abord créé une classe FaqRequestProcessor que voici :

    public class FaqRequestProcessor extends RequestProcessor
    {
    //on vérifie si l'utilisateur est bien connecté
    protected boolean isUserConnected(HttpServletRequest request, HttpServletResponse response){

    HttpSession httpSession = request.getSession();
    //renvoie true si l'utilisateur est authentifé (par l'intermédiaire de l'attribut user) ou s'il accède à la page login
    if(request.getServletPath().contains("/login.action"))
    {
    return true;
    }
    else
    {
    if( httpSession != null && httpSession.getAttribute("user") != null)
    {
    return true;
    }
    else
    {
    return false;
    }
    }
    }

    //on vérifie si la session a expirée : la session expire si l'id de la session n'est pas valide
    protected boolean isSessionValid(HttpServletRequest request) throws ServletException
    {
    if (request != null)
    {
    return request.isRequestedSessionIdValid();
    }
    return false;
    }

    protected boolean processRoles(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping)
    throws IOException, ServletException
    {

    ActionMessages messages = new ActionMessages();
    //vérification de la session
    if (isSessionValid(request))
    {
    //vérification de l'authentification
    if (isUserConnected(request, response))
    {
    return true;
    }
    else
    {
    messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("erreurs.connection.required"));//ajout du message
    request.setAttribute(Globals.ERROR_KEY, messages);
    }
    }
    else
    {
    messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("erreurs.session.expired"));//ajout du message
    request.setAttribute(Globals.ERROR_KEY, messages);
    }
    //redirection vers une page d'erreur
    request.getRequestDispatcher("/WEB-INF/vues/login.jsp").forward(request, response);
    return false;
    }
    }
    J'ai modifié le fichier struts-config.xml pour qu'il prenne en compte cette classe et non le RequestProcessor par défaut.

    Je possède donc un formulaire de login, qui correspond à la page d'entrée de l'application web (défini dans le web.xml) :

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Gestion de stocks - Identification</title>
    <html:javascript formName="identificationForm" />
    <script language="javascript" src="JS/md5.js"></script>
    <script language="javascript">
    function envoyer()
    {
    with(document.identificationForm)
    {
    if(validateIdentificationForm(document.identificationForm))
    {
    password.value = MD5(password.value);
    submit();
    }//if
    }//with
    }//envoyer
    </script>
    </head>
    <body>
    <center>
    <h2>Ouvrir une session</h2>
    <html:form action="/login" styleId="identificationForm">
    <table>
    <tr>
    <td>login : </td>
    <td><html:text property="login" /></td>
    </tr>
    <tr>
    <td>password : </td>
    <td><html:password property="password" /></td>
    </tr>
    </table>
    <table>
    <tr>
    <td><input type="button" value="Connexion" onclick="envoyer()" /></td>
    <!-- <td><input type="submit" value="Connect" name="submit" /></td> -->
    </tr>
    </table>
    </html:form>
    <html:errors />
    </center>
    </body>
    </html>
    Ce formulaire permet d'entrer login/mdp, crypte le mdp avec l'algo de cryptage MD5 et appelle ensuite une action que voici :

    public class LoginAction extends ForwardAction
    {
    public ActionForward execute(ActionMapping arg0, ActionForm arg1, HttpServletRequest arg2, HttpServletResponse arg3) throws Exception
    {
    //Récupération du formulaire
    DynaActionForm formulaire = (DynaActionForm)arg1;
    String login = (String)formulaire.get("login");
    String password = (String)formulaire.get("password");
    ActionMessages am = getErrors(arg2);

    //obtention de session hibernate
    Session session = HibernateUtil.currentSession();
    //debut transaction
    session.beginTransaction();
    //chargement par hibernate de la liste des employés
    List result = session.createQuery("from Employe where nom='" + login + "'").list();

    //commit hibernate
    session.getTransaction().commit();

    //fermeture session
    HibernateUtil.closeSession();

    //Traitement du résultat
    if(result.size() == 0)
    am.add("baduser", new ActionMessage("identificationForm.badUser"));
    else
    {
    Employe e = (Employe)result.get(0);

    if(!e.getPass().equals(password))
    am.add("badpass", new ActionMessage("identificationForm.badPassword"));
    }

    //Présence d'erreurs ?
    if(am.size() != 0)
    {
    saveErrors(arg2, am);
    return arg0.getInputForward();
    }

    return arg0.findForward("connexion");
    }
    }
    Cette action vérifie simplement (grâce à hibernate) que l'utilisateur utilise le bon couple login/mdp. Si il à faut, il est renvoyé sur la page de login, avec un jolie message d'erreur classique. Sinon, il est envoyé sur une page d'accueil.

    Voici mon problème : sans utilisé le nouveau RequestProcessor, l'application marche parfaitement, mais pas de gestion de session. Dès que j'ajoute le RequestProcessor, j'arrive sur le formulaire d'identification, mais dès que je valide, le RequestProcessor me sort une erreur de conexion "erreurs.connection.required".

    La fonction isSessionValid(request) à donc bien envoyée true, mais la seconde fonction isUserConnected(request, response) renvoie false.

    ici :
    protected boolean isSessionValid(HttpServletRequest request) throws ServletException
    {
    if (request != null)
    {
    return request.isRequestedSessionIdValid();
    }
    return false;
    }
    if (request != null) retourne true donc l'objet requête est bien initialisé, mais request.isRequestedSessionIdValid(); renvoie false. C'est là que ca cloche.

    Quelqu'un pourrait m'aider ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 23
    Par défaut
    Je rectifie !! J'ai fait une erreur !!

    Ce n'est pas la fonction isSessionValid, mais plutôt isUserConnected qui renvoie false.

    Cela est peut etre dû (et même surement) à :
    request.getServletPath().contains("/login.action")
    qui me renvoie faux alors qu'elle devrait, comme je suis sur la page de connexion, me renvoyer true.

    D'après le tuto, /login.action doit correspondre à /login.do car comme défini dans le web.xml :

    <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    Seulement, comme m'a page de connexion correspond à l'entré de l'application :

    <welcome-file-list>
    <welcome-file>/WEB-INF/vues/login.jsp</welcome-file>
    </welcome-file-list>
    l'url est la suivante : http://localhost:8080/gestionStocks/

    Est-ce cela qui fait que ca ne fonctionne pas ?? Ou alors j'ai oublié quelque chose d'autre ??

  3. #3
    Expert confirmé

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Par défaut
    Lorsque tu valides le formulaire d'identification, le path de la Servlet exécutée est /login.do.
    Il faut donc plutôt coder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.getServletPath().contains("/login.do")

Discussions similaires

  1. charger une session avec un sessionID
    Par tuxout dans le forum ASP
    Réponses: 9
    Dernier message: 21/02/2008, 17h28
  2. [EJB3] [Débutant] Comment conserver une session avec des EJB ?
    Par Invité dans le forum Java EE
    Réponses: 5
    Dernier message: 08/02/2007, 23h36
  3. Ouvrir une session avec une condition
    Par turboklm dans le forum Langage
    Réponses: 4
    Dernier message: 25/10/2006, 23h29
  4. [session] gestion d'une session par fenetre de navigateur
    Par devtele dans le forum Développement Web en Java
    Réponses: 9
    Dernier message: 14/12/2005, 10h20
  5. Démarrer automatiquement une session avec pass
    Par cyberman.inc dans le forum Windows XP
    Réponses: 3
    Dernier message: 07/08/2005, 17h55

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