Bonjour,
J'ai un problème avec une de mes applications J2EE.
Pour faire court et exposer mon problème dans un contexte plus clair, j'ai une structure qui comprend:
- Une applet java qui permet à un utilisateur de rentrer son login et mot de passe et de lancer une authentification
- Deux servlets : une de connection et de deconnection. Ces deux servlets instancient un ejb qui permet d'effectuer une requête en BDD pour vérifier les logins utilisateur
- des EJB pour diverses taches notamment la validation de connection et de déconnection
Lorsque cet utilisateur clique sur le bouton authentifier, la servlet de connection est appellé :
Cette servlet fonctionne correctement.
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107 package servletSpectacle; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Properties; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.rmi.PortableRemoteObject; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import myEJB.facade; import myEJB.facadeHome; import util.Formulaire; import util.Info_connection; @SuppressWarnings("serial") public class servletConnection extends HttpServlet { // Initialisation de l'EJB facade static Context ctx = null; static facadeHome home = null; Formulaire form_connection; String login, motDePasse, resultat_connection; int id_utilisateur; Info_connection info_connect; @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Initialisation de la session HttpSession session_spectacle = request.getSession(true); System.out.println(session_spectacle.getId()); // Get InitialContext try { ctx = getInitialContext(); } catch (NamingException e) { e.printStackTrace(); System.exit(2); } // Fin du Get InitialContext // Création du Bean Facade String bName = "facadeHome"; try { home = (facadeHome) PortableRemoteObject.narrow(ctx.lookup(bName), facadeHome.class); facade bean = home.create(); // Initialisation flux entrée ObjectInputStream entree = new ObjectInputStream(request .getInputStream()); // Récupération des données de l'Applet : entree.readObject() form_connection = (Formulaire) entree.readObject(); // Dispatching des données du formulaire login = form_connection.getLogin(); motDePasse = form_connection.getMotDePasse(); // Exécution de la requette de connection resultat_connection = bean.connection(login, motDePasse); id_utilisateur = bean.getIdClient(); info_connect = new Info_connection(id_utilisateur, resultat_connection); // On cree une variable de session avec l'ID utilisateur pour les // futurs opérations session_spectacle.setAttribute("id_user", id_utilisateur); System.out.println("Connection.. : " + session_spectacle.getAttribute("id_user")); // Préparation du flux de sortie ObjectOutputStream sortie = new ObjectOutputStream(response .getOutputStream()); // Envoie des données de sortie : sortie.writeObject(); sortie.writeObject(info_connect); } catch (Exception e) { e.printStackTrace(); System.exit(2); } } static private Context getInitialContext() throws NamingException { String url = "rmi://localhost:1099"; try { // Get an InitialContext Properties h = new Properties(); h .put(Context.INITIAL_CONTEXT_FACTORY, "org.objectweb.carol.jndi.spi.MultiOrbInitialContextFactory"); h.put(Context.PROVIDER_URL, url); return new InitialContext(h); } catch (NamingException ne) { ne.printStackTrace(); throw ne; } } }
Lorsque l'utilisateur veut se déconnecter il appuie sur un bouton "deconnection" et à ce moment, la servlet de deconnection est appellé :
Mon but ici est d'utiliser une variable de session pour tracer l'utilisaeur durant toute sa présence sur l'applet java.
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92 package servletSpectacle; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Properties; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.rmi.PortableRemoteObject; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import util.Info_connection; import myEJB.facade; import myEJB.facadeHome; public class servletDeconnection extends HttpServlet { static Context ctx = null; static facadeHome home = null; static Info_connection info_deco; @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Initialisation de la session HttpSession session_spectacle = request.getSession(true); System.out.println(session_spectacle.getId()); // Get InitialContext try { ctx = getInitialContext(); } catch (NamingException e) { e.printStackTrace(); System.exit(2); } // Fin du Get InitialContext String bName = "facadeHome"; try { home = (facadeHome) PortableRemoteObject.narrow(ctx.lookup(bName), facadeHome.class); facade bean = home.create(); // Initialisation flux entrée ObjectInputStream entree = new ObjectInputStream(request .getInputStream()); // Récupération des données de l'Applet : entree.readObject() info_deco = (Info_connection) entree.readObject(); // Lancement de la deconnection au niveau de l'EJB bean.deconnection(); System.out.println("Deconnection... : " + session_spectacle.getAttribute("id_user")); // Destruction de la session session_spectacle.invalidate(); // Préparation du flux de sortie ObjectOutputStream sortie = new ObjectOutputStream(response .getOutputStream()); // Envoie des données de sortie : sortie.writeObject(); info_deco.setId_user(0); info_deco.setResultat_connection("Deconnection reussie"); sortie.writeObject(info_deco); } catch (Exception e) { e.printStackTrace(); System.exit(2); } } static private Context getInitialContext() throws NamingException { String url = "rmi://localhost:1099"; try { // Get an InitialContext Properties h = new Properties(); h .put(Context.INITIAL_CONTEXT_FACTORY, "org.objectweb.carol.jndi.spi.MultiOrbInitialContextFactory"); h.put(Context.PROVIDER_URL, url); return new InitialContext(h); } catch (NamingException ne) { ne.printStackTrace(); throw ne; } } }
Mon problème est que ma session n'est pas "sauvegardé" entre les différentes servlet...Les deux sessions obtenue sur les deux servlet lors d'une même utilisation de l'applet sont différentes.
Que dois-je faire pour que ma session à chaque appel d'une servlet, soit la même ?
J'ai passé ma journée à chercher un peut partout sur le web sans grand succès, j'ai vu plusieurs réponses qui n'ont pas résolu mon problème. Des que j'effectue un request.getSession(true); ou même, request.getSession(); j'obtient une nouvelle session, malgré qu'au préalable une session a déjà été instancier par une autre servlet.
Y'a t'il quelque chose à mettre dans l'applet pour conserver les sessions ?, dois'je passer en paramètre quelque chose pour que ma servlet reçoive la session ?
Je vous remercie du temps que vous prendrez pour m'aider, ce point est très important dans mon projet, et il ne me reste que ce point a résoudre.
Si vous avez besoin de plus d'informations, n'hésitez pas.
Cordialement,
David D.
Partager