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

Servlets/JSP Java Discussion :

Pb de session avec ma servlet


Sujet :

Servlets/JSP Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 121
    Par défaut Pb de session avec ma servlet
    Bonjour,

    Dans le cadre d'un de mes cours, je suis en train de développer une servlet gérant un panier à provisions.
    Pour l'affichage, j'utilise des pages JSP.

    L'objectif que j'essaye d'atteindre est:
    • Autenthification de l'utilisateur
    • Affichage des objets et de la quantité disponible
    • Choix des objets par l'utilisateur
    • Affichage du panier


    Je crée une session par utilisateur afin d'enregistrer leur choix.

    N'ayant pas de base de données pour l'appli, je crée également une session pour la gestion et l'affichage des quantités. Au démarrage, je charge des valeurs à l'intérieur que je modifie par la suite.

    Je n'arrive pas à faire en sorte que si l'utilisateur1 choisi un article alors la quantité est décrémentée et affichée pour l'utilisateur2 qui arrive juste après.

    Le réel problème vient du fait que quand j'appelle la page de login, je recrée la session quantite du coup l'utilisateur2 ne voit pas le "stock réel".

    Je ne vois pas comment faire pour créer ma session quantite et ne plus l'écraser en suite. Je voudrais faire une sorte de "super session" qui serait créé au démarrage puis plus écraser mais juste modifier.

    Est ce possible?

    Merci d'avance pour votre aide.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Si tu veux une "variable" globale à ton application, utilise la méthode getServletContext() que tu peux appeler à partir d'un objet HttpSession.
    Cette méthode te renvoie un servletContext sur lequel tu peux appeler les méthodes setAttribute, qui fonctionnent comme celles d'une session ou d'une request.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 121
    Par défaut
    Merci pour cette réponse rapide,

    Je pense que je n'ai pas été très clair au niveau du fonctionnement des pages.

    Lorsque j'appelle la page de login (1° page de la servlet), je crée la session quantité ainsi que la session utilisateur ensuite je passe à la page de choix des articles.
    Donc à chaque fois que j'appelle cette page de login, j'écrase ma session quantite qui a été crée la 1° fois.

    si je fais ce que tu me dis, à chaque appel de la page de login la variable "globale "va être écrasée non?

    Ci-dessous le code la classe associée à la page de login:
    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
    package com.store.Actions.User;
     
    import java.util.Hashtable;
     
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
     
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
     
    import com.store.forms.userForm;
     
    public class LoginUserAction extends Action{ 
    	@Override
    	public ActionForward execute(ActionMapping arg0, ActionForm arg1, HttpServletRequest arg2, HttpServletResponse arg3) throws Exception {
    		//Définition de la session
    		HttpSession session;
    		HttpSession quantite;
    		userForm loginform = (userForm) arg1;
    		if (arg2.getParameter("submituser")!=null)
    		{
    			//Table de hachage pour les quantités
     
    			Hashtable<String, String> qt = new Hashtable<String,String>();
    			qt.put("Tasse USB","10");
    			qt.put("Gants","10");
    			qt.put("Clavier","10");
    			qt.put("Ipod","10");
    			quantite = arg2.getSession(true);
    			quantite.setAttribute("qt", qt);
    			//Codage en dur de l'utilisateur, sachant qu'avec une base de données, ce serai dynamique
    			if((loginform.getUser().getlogin().equals("toto" ) || loginform.getUser().getlogin().equals("toto2" )) && loginform.getUser().getmdp().equals("toto"))
    			{
    				//Création de la session avec le nom d'utilisateur comme attribut
    				session = arg2.getSession(true);
    				session.setAttribute("login",loginform.getUser().getlogin());
    				return arg0.findForward("success");
    			}
    			else
    				return arg0.findForward("failure");
    		}
    		return arg0.findForward("index");	
    	}
    }
    Je sais que la hashtable ne sert pas forcément car je pourrais faire directement des setAttribute() dans la session mais vu qu'on est deux sur le projet je l'ai laissée pour le moment.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Il ne faut pas mettre l'initialisation de tes produits dans la servlet qui gere le login.
    Il faut mettre cette portion de code par exemple, dans une servlet qui ne sera appelée qu'une fois au lancement de ton application.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 121
    Par défaut
    ok je vais essayer ça

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 121
    Par défaut
    Merci pour ton aide ça marche

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Par défaut
    Moi je te conseil d'utiliser la méthode init() de ta servlet ...


    Celle-ci est appelé une seule fois (généralement après le premier accès à cette servlet). Quand j'étais encore à l'école (bah, ca fait quelques mois que j'ai fini ), je créais un accès à la bd à partir de la ... pour mon nouveau projet, j'utilise encore cette méthode "init()" pour créer un accès à mes EJBs

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 121
    Par défaut
    merci de ta réponse mais on a rajouté une page d'initialisation à l'appli

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Par défaut
    Hum... tu pourrais m'expliquer ce que tu entends par "page d'initialisation de l'application" ???

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    @loopx
    Tu as raison sur le principe, sauf qu'aller mettre du code sur l'initialisation d'une application dans une méthode d'une servlet gérant le login, c'est pas super logique.

    Tu peux implémenter l'interface ServletContextListener et plus particulièrement la méthode contextInitialized, qui sera appelée à l'initialisation de ton application.
    Il faut déclarer cette classe dans ton web.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <listener>
            <listener-class>tonpackage.TaClasse</listener-class>
        </listener>

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 121
    Par défaut
    Par page d'initialisation, j'entend une page que j'appelle qu'une seule fois et qui me crée la session quantite

    la page de login est l'index que j'appelle en faisant http://localhost:8080/.../index.do

    ma page d'initialisation est la page creation que j'appelle en faisant http://localhost:8080/.../creation.do

    Cet appel je le fais une seule fois au début, ensuite je me contente d'appeler l'index

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Par défaut
    ah, c'est original.. pour l'école, ca peut être "bien" pour bien montrer que ca fonctionne, mais pas pour un site "réel" je pense.


    Pour la méthode init, en fait, ben .. tu as compris... Mais ce que tu n'a pas compris, c'est que pour l'instant, je n'ai qu'une servlet ControlServlet (maintenant, j'ai rajouté une autre qui aura une tache complètement différente). ControlServlet est une servlet qui est toujours appellée. Si je ne me trompe pas, cela respecte le modèle MVC ... Donc j'ai une page JSP (qui pourrais être html) et qui va appeller la servlet lors du login ... Maintenant, si tu appelle une autre page du site, tu as 2 possibilités:

    - soit tu as accès à la page (celle-ci ne demande rien de particulier: pas d'accès bd ou autre)
    - soit tu dois être authentifié (si tu l'es pas, t'es redirigé vers login et tu sera obligé de passer un moment ou l'autre par ControlServlet (c'est lui qui crée la session http ...)


    Maintenant, il est vrai que je vais avoir un problème: si je crée un accès "anonymous", .... enfin pas dis, parce que anonymous ou pas, faut quand meme s'authentifier (telle tout serveur ftp ... si on est anonymous, on est bindé sur le compte anonymous, cela est aussi une authentification).


    En fait, le problème apparaitrait si j'avais, par exemple, besoin d'un accès BD dans plus d'une servlet (donc la, il faudrait que l'init soit déplacé de manière à ce qu'elle soit à un niveau suppérieur aux servlet => au démarrage de l'application).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de session avec les JSP/Servlet
    Par FuneralRose dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 02/06/2012, 10h28
  2. Problème session avec les servlet
    Par Didiplouf dans le forum Java EE
    Réponses: 1
    Dernier message: 19/05/2011, 12h50
  3. Interroger les valeur d1 [ javabean ] avec une [ servlet ]
    Par jmeclipse dans le forum Servlets/JSP
    Réponses: 21
    Dernier message: 07/06/2005, 12h14
  4. Création d'une variable de session avec un ID
    Par PrinceMaster77 dans le forum ASP
    Réponses: 4
    Dernier message: 18/10/2004, 10h28
  5. Réponses: 2
    Dernier message: 29/03/2004, 13h44

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