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é :
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;
		}
	}
}
Cette servlet fonctionne correctement.

Lorsque l'utilisateur veut se déconnecter il appuie sur un bouton "deconnection" et à ce moment, la servlet de deconnection est appellé :

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 but ici est d'utiliser une variable de session pour tracer l'utilisaeur durant toute sa présence sur l'applet java.

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.