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

Services Web Java Discussion :

Maintient de la session entre 2 web services java


Sujet :

Services Web Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Maintient de la session entre 2 web services java
    Bonjour,

    Voici mon problème :
    Suite aux exigences client, j'ai besoin de faire 2 Web Service en JAVA.
    Le premier est un web service "générique" qui remonte toutes les informations.
    Le deuxième est un Web Service "Métier" qui permet de filtrer certaines informations

    Le premier Web Service ("générique") fonctionne très bien. Lorsque j'utilise un client JSP, une session correspond bien à une instance du web service "générique".

    Lorsque je passe par le deuxième Web Service pour interroger les méthode du premier, il y a bien une session qui se créer entre les deux. Cependant, a chaque appel de méthode du premier Web Service au travers du deuxième web service, une nouvelle instance du web service "générique" se crée.

    Dans mes descripteurs de déploiements (deploy.wsdd), le paramètre <parameter name="scope" value="session"/> est bien présent.

    J'ai également utiliser un filtre sur le Web Service "générique" pour voir si les sessions et cookies existaient. Les session et les cookies existent bien et ils ne sont pas recréés pour les appels d'un même client.
    De ce fait, dans la classe SoapBindingStub du web service "métier", j'ai bien les lignes suivantes :

    - pour le première méthode appelée :
    _call.setProperty(HTTPConstants.HEADER_SET_COOKIE, Boolean.TRUE);

    - pour chaque méthode appelée :
    _call.setProperty(org.apache.axis.client.Call.SESSION_MAINTAIN_PROPERTY, Boolean.TRUE);
    _call.setProperty(HTTPConstants.HEADER_CONNECTION_KEEPALIVE, Boolean.TRUE);

    - à la création du Call :
    super.maintainSession = true;
    super.maintainSessionSet = true;


    La communication entre les deux Web Service fonctionne correctement car, j'ai bien le retour souhaité de la première web méthode appelée.


    Pourriez-vous éclairer ma lanterne quand à ce problème de relation entre l'instance et la session créé.

    En vous remerciant par avance.


    Serveur d'application : TOMCAT 5.5.27
    EDI : Eclipse Ganymede 3.4.2
    FrameWork : AXIS 1.4
    JRE : 6
    JDK : 1.6

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Après plusieurs tentatives, j'ai enfin trouvé une réponse.
    Cette réponse est loin d'être propre mais elle a le mérite de fonctionner.


    Dans un premier temps, créer un filtre sur le 1er Web Service.
    Dans ce filtre, mettre deux ArrayList (ou autres) et une variable de type HttpSession en Static.
    Le premier ArrayList Contient les instance du WS.
    Le deuxième ArrayList contient les sessions.
    Il est très important de garder la correspondance (index) entre les deux ArrayList.
    La Variable de HttpSession contiendra la session utilisé
    Dans la méthode surchargée doFilter, récupérer la session.
    Si la session est nouvelle on la rajoute dans l'ArrayList contenant les sessions.
    Si elle n'est pas nouvelle on ne fait rien.
    Ensuite on met systématiquement la session dans la variable de type HttpSession.
    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
     
    public class MyFilter implements Filter {
     
    	private static ArrayList<WebServiceMetier> InstanceWsMr = new ArrayList<WebService>();
    	private static ArrayList<HttpSession> SessionMatchInstanceWs = new ArrayList<HttpSession>();
     
    	private static HttpSession LastSessionUsed = null;
     
     
    	  public void init(FilterConfig config) throws ServletException {
    	    this.config = config;
    	  }
     
    	public void destroy() {
    	    config = null;
    	  }
     
     
    	  public void doFilter(ServletRequest request, ServletResponse response,
    	                     FilterChain chain) throws IOException, ServletException {
    	    HttpSession session = ((HttpServletRequest)request).getSession(true);
     
    	    if (session.isNew()) {
    	    	System.out.println("New session");
    	    	SessionMatchInstanceWs.add(session);
    	    } else {
    	    	System.out.println("Reload session");
    	    }
     
    	    setLastSessionUsed(session);
    	    chain.doFilter(request, response);
    	    System.out.println("Session : " + session.getId());
    	    setLastSessionUsed(null);
               }
     
    }

    Dans votre web.xml,
    afin que votre filtre soit actif, il vous suffit de rajouter le code suivant
    à la fin de votre fichier.
    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
     
    ....
    ....
    .....
    ....
     
                    </welcome-file-list>
     
    		<!--
    			Filtre permettant de récupérer la session utilisée
    		-->
    		<filter>
    			<filter-name>myfilter</filter-name>
    			<filter-class>mypackage.MyFilter</filter-class>
    		</filter>
     
    		<filter-mapping>
    			<filter-name>myfilter</filter-name>
    			<url-pattern>/*</url-pattern>
    		</filter-mapping>	
     
     
     
     
     
     
    </web-app>

    Ensuite dans le constructeur de l'instance du WS, Rajouter une méthode permettant de vérifier la session.
    Dans cette méthode il suffit de faire la correspondance entre la session et l'instance à créer ou précédemment créée.
    Si la session est nouvelle, l'instance l'ai aussi. Dans ce cas il suffit de rajouter l'instance dans l'ArrayList contenant les instances.
    Si la session n'est pas nouvelle, c'est que l'instance existe déjà. alors il faut retrouver la bonne instance et en récupérer les informations (classes instancié, variables globales, etc...)


    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
     
     
           /*Constructeur*/
    	public MonwS() {
    		/*On récupère l'instance correspondant à la session*/
    		getSessionMatchInstance();
    	}
     
     
     
     
     
            private void getSessionMatchInstance() {
    		//instance a enregistrer
    		boolean IsNewSession = false;
    		if (MyFilter.getInstanceWs().size() < MyFilter.getSessionMatchInstanceWs().size()) {
    			MyFilter.setInstanceWs(this);
    			IsNewSession = true;
    		} else if (MyFilter.getInstanceWs().size() == MyFilter.getSessionMatchInstanceWs().size()) {
    			//on cherche la bonne session
    			boolean DoSearchSession = true;
    			int IndexOfSession = -1;
    			int CompteurSession = 0;
    			while (DoSearcSession) {
    				if (CompteurSession == MyFilter.getSessionMatchInstanceWs().size()) {
    					DoSearcSession = false;
    				} else {
    					if (MyFilter.getSessionLastSessionUsed().getId().equals(MyFilter.getSessionMatchInstanceWs().get(CompteurSession).getId())) {
    						IndexOfSession = CompteurSession;
    						DoSearcSession = false;
    					} else {
    						CompteurSession++;
    					}
    				}
    			}
     
    			/*Si on trouver la bonne session, on transfert les différentes classes
    			 * à l'instance en cours*/
    			if ((IndexOfSession != -1) && (IsNewSession == false)) {
    				/*Transfert des différentes classes
                                     ex : this.classe1 = MyFilter.getInstanceWs().get(IndexOfSession).getClasse1();*/
    				....
                                   .....
    			}
    		}
    	}

    Et voila,
    on ne récupère pas vraiment l'instance elle même mais
    plutôt tous ces composants.

  3. #3
    Membre VIP Avatar de kalysto
    Profil pro
    Développeur
    Inscrit en
    Mars 2003
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mars 2003
    Messages : 442
    Points : 568
    Points
    568
    Par défaut
    Pour info, un webservice est sensé etre un composant sans etat.

  4. #4
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 19
    Points : 20
    Points
    20

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/07/2011, 09h05
  2. Dialogue entre 2 web service
    Par Quatre_Couleurs dans le forum Services Web
    Réponses: 0
    Dernier message: 30/04/2009, 16h22
  3. conflit entre deux web services
    Par cafetux dans le forum Services Web
    Réponses: 1
    Dernier message: 17/03/2009, 15h12
  4. recupération de la session dans le web service
    Par samu14 dans le forum Services Web
    Réponses: 0
    Dernier message: 05/02/2009, 08h59
  5. Session dans les web services
    Par casper_mc dans le forum Services Web
    Réponses: 1
    Dernier message: 27/06/2008, 21h46

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