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

Développement Web en Java Discussion :

Gestion des sessions avec HttpURLConnection


Sujet :

Développement Web en Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 34
    Points : 35
    Points
    35
    Par défaut Gestion des sessions avec HttpURLConnection
    Bonjour à tous,
    je dois développer un petit programme en java qui a pour but d'exécuter une requête http en fonction de quelques paramètres donnés en entrée. C'est le genre de choses que je n'avais jamais fait et ce post sur le forum m'a beaucoup aidé à faire une première partie. La requête est bien envoyée. Cependant j'ai un problème auquel je ne trouve pas de solutions depuis et j'avoue je ne sais pas trop par où commencer. Voilà, le serveur qui doit exécuter la requête demande une authentification pour chaque requête. En gros il faut d'abord être connecté au système avant de faire quoi que se soit. Une fois que vous êtes connecté, vous pouvez faire tout se qui vous est permit. Ce ci est géré grâce aux sessions entre autre et en php en fait. Donc pour que mon programme fonctionne, il faut que j'envois une première requête qui va authentifier mon programme avant d'envoyer ma requête prévue. Lorsque j'envois la requête d'authentification, tout se passe bien et la réponse me dit que je suis connecté mais lorsque j'envois la deuxième requête, je le serveur me répond que je ne suis pas authentifié. Ce qui me fait penser que chaque requête émise par mon programme est perçue comme provenant d'une session à part. Ce que je voulais savoir c'est si c'est possible d'envoyer plusieurs requêtes de la même session. Je vais mettre mon code, j'espère que mon explication est claire sinon je suis disposé à donner plus d'informations

    La classe UrlManager qui envoit les requette et qui est un copier coller de la solution du post que j'ai cité
    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
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.ConnectException;
    import java.net.HttpURLConnection;
    import java.net.URL;
     
     
    public class UrlManager {
     
     
    	public String postURL(URL a_Url, String a_sParamsToPost)
    	{
    	      StringBuilder o_oSb = new StringBuilder();
    	      //recup du saut de ligne
    	      String o_sLineSep = null;
    	      try
    	      {
    	         o_sLineSep = System.getProperty("line.separator");
    	      }
    	      catch (Exception e)
    	      {
    	         o_sLineSep = "\n";
    	      }
     
    	      try
    	      {
    	         HttpURLConnection o_oUrlConn = (HttpURLConnection) a_Url.openConnection();
    	         o_oUrlConn.setRequestMethod("POST");
    	         o_oUrlConn.setAllowUserInteraction(false);
    	         //envoyer des params
    	         o_oUrlConn.setDoOutput(true);
     
    	         //poster les params
    	         PrintWriter o_oParamWriter = new PrintWriter(o_oUrlConn.getOutputStream());
     
    	         o_oParamWriter.print(a_sParamsToPost);
    	         //fermer le post avant de lire le resultat ... logique
    	         o_oParamWriter.flush();
    	         o_oParamWriter.close();
     
    	         //Lire la reponse
    	         InputStream  o_oResponse = o_oUrlConn.getInputStream();
    	         BufferedReader o_oBufReader = new BufferedReader(new InputStreamReader(o_oResponse));
    	         String sLine;
     
    	         while ((sLine = o_oBufReader.readLine()) != null)
    	         {
    	            o_oSb.append(sLine);
    	            o_oSb.append(o_sLineSep);
    	         }
    	         //deconnection
    	         o_oUrlConn.disconnect();
    	      }
    	      catch(ConnectException ctx)
    	      {
     
    	        ctx.printStackTrace();
    	      }
    	      catch (Exception e)
    	      {
     
    	         e.printStackTrace();
    	      }
     
    	      return o_oSb.toString();
    	    }
    }
    L'envoi des requêtes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UrlManager mng=new UrlManager();
    URL url=new URL("l'url de connexion qui marche bien");
    //connexion
    String reponse = mng.postURL(url, "");
    System.out.println(reponse);
    System.out.println("je dois renvoyer le solde du client :"+sms.getExpediteur());
    url=new URL("l'url d traitement qui me dit que je ne suis pas connecté");
    System.out.println(mng.postURL(url, ""));

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 173
    Points : 187
    Points
    187
    Par défaut
    D'après ce que tu évoques il semblerait donc que la session associée à la connexion ne soit pas la même entre l'envoi de ta première URL et l'envoi de la deuxième. Ne serait-ce pas dû au fait que tu ouvres une nouvelle connexion dans postURL()?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HttpURLConnection o_oUrlConn = (HttpURLConnection) a_Url.openConnection();
    Javadoc de URL: http://docs.oracle.com/javase/7/docs...enConnection()
    Diplomes: DUT informatique et Master 2 MIAGE.
    Développeur Java/J2EE (principalement), .NET (niveau scolaire mais je compte m'améliorer ) et Web (HTML, PHP...).

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    En fait, ton serveur authentifie une session, mais lorsque tu fais des appels successifs avec la classe HttpURLConnection (ou URLConnection), rien ne dit que c'est sur la même session que les différentes requêtes sont faites. il faut faire l'authentification (une première requête) et indiquer au serveur que toutes les requêtes suivantes qu'on fait doivent être faites sur la même session déjà authentifiée. Lorsqu'on s'authentifie, le serveur retourne au client dans les informations http (headers) un identifiant de session (un jeton) que tu dois transmettre à chaque requête envoyées au serveur (également dans les headers), pour indiquer qu'elles doivent toutes s'effectuer sur cette même session .

    On peut le faire avec URLConnection. On peut aussi le faire plus simplement avec une API comme Apache HTTPClient (on a plus vraiment à s'en préoccuper en fait, y compris quand le cas se compléxifie, comme par exemple, si on se connecte sur un reverse-proxy par exemple). Peux-tu utiliser HTTPClient ?

    Sinon pour gérer ça avec une HTTPURLConnection, tu peux récupérer le JSESSIONID, dans le cas le plus simple, comme ça :

    Après avoir fait la première requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String serverCookies = conn.getHeaderField("Set-Cookie");
    if (serverCookies != null){ 
        for(String s : serverCookies.split(";")){
          String[] parts = s.trim().split("=");
          if( parts.length==2 && "JSESSIONID".equals(parts[0])){
              jsessionid = parts[1]; // la variable jsessionid doit pouvoir être réenvoyée dans les autres requêtes
               break;
          }
       }
    }
    Et de le renvoyer au serveur comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    urlConnection.setRequestProperty("Cookie", jsessionid); // on renvoit le JSESSIONID obtenue lors de la requête d'authentification
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 34
    Points : 35
    Points
    35
    Par défaut
    J'ai pu récupérer l'identifiant de la session comme vous l'avez expliqués. Mais je n'ai pas l'impression que le fait de le passer à la connexion suivante fonctionne car ma seconde requette renvois toujours un message comme si elle est déconnectée.

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Je me suis trompé dans le set. Il fallait écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    urlConnection.setRequestProperty("Cookie", "JSESSIONID="+jsessionid); // on renvoit le JSESSIONID obtenue lors de la requête d'authentification
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 34
    Points : 35
    Points
    35
    Par défaut
    OK, j'ai déjà recu l'autorisation de modifier un peu le serveur pour pouvoir faire autrement et ma nouvelle solution a bien fonctionné mais je vais quand même reproduire ceci dans l'après midi et tester pour voir si ça fonctionne afin que ça puisse aider d'autres.

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Pourquoi ne pas utiliser Apache HTTPClient ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    HttpClient httpClient = new DefaultHttpClient();
    CookieStore cookieStore = new BasicCookieStore();
    HttpContext httpContext = new BasicHttpContext();
    httpContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
    // ...
     
    HttpResponse response1 = httpClient.execute(method1, httpContext);
    // ...
     
    HttpResponse response2 = httpClient.execute(method2, httpContext);
    Je suis resté fixé sur une simple gestion de session (comme tu utilisais URLConnection et que tu parlais de petit programme), mais si c'est une vraie authentification (BASIC, DIGEST...), ce sera beaucoup plus simple à gérer avec HTTPClient (sans parler du reste). Voir les exemples, pour l'authentification entre autres, ici.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 34
    Points : 35
    Points
    35
    Par défaut
    Pour ce qui est du problème que j'ai posé en effet ta solution pour passer la variable de session a fonctionné même si au final je n'ai plus du tout utilisé cela en production. J'ai plutôt modifié le serveur pour qu'il puisse faire les 2 opérations en même temps selon certains paramètres qui ont été approuvés par ma hiérarchie. Donc en une requête, le serveur authentifie puis traite avant de donner la réponse.
    Dans un soucis de recherche j'ai néanmoins reproduit le cas de figure pour tester ta solution et elle a fonctionné, merci ça me sera utile forcément (et pas qu'à moi je pense)
    pour se qui est de ta dernière proposition je vais également la tester pour voir se que ça donne. Pour mes recherches personnelles. Je vais mettre le sujet comme résolu.Mais si j'ai des soucis avec la dernière méthode lors de mes tests, je pourrais continuer à poster ici ou il faudra ouvrir un autre sujet?

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

Discussions similaires

  1. Gestion des sessions avec Tomcat
    Par flo_rian dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 17/12/2008, 15h02
  2. [MySQL] Gestion des sessions avec login et password
    Par jeremay dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 17/07/2008, 07h53
  3. Gestion des sessions avec 2 serveurs et 1 loadbalancer
    Par scorpia dans le forum Langage
    Réponses: 4
    Dernier message: 19/02/2007, 09h56
  4. gestion des sessions avec le controller struts
    Par don'de dans le forum Struts 1
    Réponses: 4
    Dernier message: 18/12/2006, 18h21
  5. Gestion des sessions avec applet
    Par Mister Nono dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 01/08/2006, 18h27

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