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

Java Discussion :

Recuperer un cookie d'une requête POST


Sujet :

Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Points : 121
    Points
    121
    Par défaut Recuperer un cookie d'une requête POST
    Bonjour,

    J'ai besoin de récupérer le numéro de Session du cookie PHPSESSID après une identification par formulaire sur un site (elle se fait pas méthode POST).
    Voilà comment je procède actuellement pour l'identification :

    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
     
    post("http://adresse", new String[][]
     		{ {"login","Monlogin"}, {"pwd","monPass"} }
     		);
     
    ......
     
    	static String post(String adresse,String[][] data){
    	   OutputStreamWriter writer = null;
    	   BufferedReader reader = null;
    	   String retour = null;
    	   try {
    	     //encodage des paramètres de la requête
    	      String donnees = "";
    	      for(int i=0;i<data.length;i++)
    	    {
    	    	  donnees+=URLEncoder.encode(data[i][0], "UTF-8")+"="+URLEncoder.encode(data[i][1], "UTF-8")+((i!=data.length-1)?"&":"");
    	    }
     
    	      //création de la connection
    	      URL url = new URL(adresse);
    	      URLConnection conn = url.openConnection();
    	      conn.setRequestProperty( "User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)" );
     
     
    	      conn.setDoOutput(true);
     
    	      //envoi de la requête
    	      writer = new OutputStreamWriter(conn.getOutputStream());
    	      writer.write(donnees);
    	      writer.flush();
     
    	      //lecture de la réponse
    	      reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
     
    			StringBuilder sb = new StringBuilder();
    			char[] cbuf = new char[8192];
    			int len;
    			while ( (len = reader.read(cbuf)) >= 0 ) {
    				sb.append(cbuf, 0, len);
    			}
    			retour = sb.toString();
    	   }catch (Exception e) {
    	      e.printStackTrace();
    	   }finally{
    	      try{writer.close();}catch(Exception e){}
    	      try{reader.close();}catch(Exception e){}
    	   }
    	   return retour;
    	}
    Comment puis je faire pour recuperer le cookie PHPSESSID après cette requête post ?

    Merci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,



    Avec Java 6 tu peux activer une gestion automatique des Cookies. Ils seront récupérés/envoyés automatiquement à chaque requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CookieHandler.setDefault(new CookieManager());

    Avec Java 5 la classe CookieManager n'existe pas, donc tu seras obligé de l'implémenter...




    Sinon quelques remarques sur ton code :

    • Utilises de préférence un try/finally par ressource. Cela te permet à la fois de les fermer au plus tôt, mais également de ne pas ignorer l'exception de fermeture.
    • Indiques toujours le charset sur les InputStreamReader/OutputStreamWriter. Sinon tu risques d'avoir de mauvaises surprise...
    • De même il serait préférable de préciser le content-type de la requête. Son absence pourrait poser problème selon le serveur que tu as en face...
    • Utilises aussi un StringBuilder pour générer les données POST...
    • Remontes l'exception au lieu d'un simple printStackTrace(). Cela permettra une meilleur gestion à plus haut niveau.


    Bref quelque chose comme cela :
    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
    	static String post(String adresse, String[][] data) throws IOException {
    		// encodage des paramètres de la requête
    		StringBuilder donnees = new StringBuilder();
    		for (int i = 0; i < data.length; i++) {
    			donnees.append(URLEncoder.encode(data[i][0], "UTF-8"))
    				.append("=").append(URLEncoder.encode(data[i][1], "UTF-8"))
    				.append("&");
    		}
     
    		// création de la connection
    		URL url = new URL(adresse);
    		URLConnection conn = url.openConnection();
    		conn.setRequestProperty("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)");
    		conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
     
    		conn.setDoOutput(true);
     
    		// envoi de la requête
    		final OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
    		try {
    			writer.write(donnees.toString());
    			writer.flush();
    		} finally {
    			writer.close();
    		}
     
    		// lecture de la réponse
    		final BufferedReader reader = new BufferedReader(new InputStreamReader(conn
    					.getInputStream()));
    		try {
    			StringBuilder sb = new StringBuilder();
    			char[] cbuf = new char[8192];
    			int len;
    			while ((len = reader.read(cbuf)) >= 0) {
    				sb.append(cbuf, 0, len);
    			}
    			return sb.toString();
    		} finally {
    			reader.close();
    		}
    	}

    a++

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Points : 121
    Points
    121
    Par défaut
    Oui désolé pour le code, c'est juste une petite application de bureau sans prétention faite un peu vite.

    J'ai essayé le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CookieHandler.setDefault(new CookieManager());
    		CookieStore store=((CookieManager)CookieHandler.getDefault()).getCookieStore();
    		Fc.post("http://adresse", new String[][]
     		{ {"login","log"}, {"pwd","pass"} }
     		);
    		List<HttpCookie> cookies=store.getCookies();
    		for(HttpCookie cookie:cookies)
    		{
    			System.out.println(cookie.getName());
    			System.out.println(cookie.getValue());
    		}
    Mais ça ne m'affiche rien. Pourtant quand je vais sur le site, je suis bien identifié

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Utilises l'objet URLConnection pour afficher tous les headers à la réception de la requête pour voir s'il y a bien un Set-Cookie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	// lecture des headers :
    	for (Map.Entry<?,?> entry : conn.getHeaderFields().entrySet()) {
    		System.out.println(entry);
    	}

    Après l'authentification n'est pas forcément basé sur un cookie. Certains système utilisent une paramètre dans l'URL...


    a++

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Points : 121
    Points
    121
    Par défaut
    Il me retourne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Mon Jul 25 14:31:40 CEST 2011
    null=[HTTP/1.0 200 OK]
    Date=[Mon, 25 Jul 2011 12:31:40 GMT]
    Expires=[Thu, 19 Nov 1981 08:52:00 GMT]
    Via=[1.0 proxy:8080 (squid/2.6.STABLE19)]
    Content-Type=[text/html]
    Server=[Microsoft-IIS/6.0]
    X-Powered-By=[PHP/5.2.4, ASP.NET]
    X-Cache=[MISS from proxy]
    Cache-Control=[no-store, no-cache, must-revalidate, post-check=0, pre-check=0]
    Pragma=[no-cache]
    Proxy-Connection=[close]
    Concernant les cookies, quand je vais dans le gestionnaire de cookies de Firefox, je vois qu'au nom du site, il y a bien un cookie PHPSESSID (celui que je veux recuperer)

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Le PHPSESSID est parfois passé en paramètre de l'URL.
    Regardes le code de la page que tu récupères pour voir si ce n'est pas le cas.

    Après c'est une configuration coté serveur...


    a++

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Points : 121
    Points
    121
    Par défaut
    Apparemment non, le site semble constamment prendre la valeur PHPSESSID du cookie de ce nom quand il est a besoin

  8. #8
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    En tout cas la page en question ne semble pas te renvoyer de cookies...


    a++

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

Discussions similaires

  1. [XML] Créer un fichier sur le serveur avec le contenu d'une requête POST
    Par kingmandrax dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 27/10/2006, 00h18
  2. Recuperer les params d'une requete Post?
    Par Rits dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 18/10/2006, 10h49
  3. Acquitter une requête POST sur la même connexion
    Par phaby dans le forum Langage
    Réponses: 2
    Dernier message: 18/04/2006, 10h59
  4. Comment envoyer une requête POST via HTTP ?
    Par pdtor dans le forum C++
    Réponses: 2
    Dernier message: 13/09/2005, 05h54
  5. Analyse de code HTML en réponse a une requête post.
    Par ghost942 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 04/06/2005, 21h40

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