Redirection d'url et transmission de cookies

Description

Ce programme donne des exemples de gestion des redirections d'url ainsi que de transmission de cookies lors de ces redirections.

Le programme fait 5 requêtes pour la ressource "http://localhost/Cookie1.php", et suit une redirection vers la ressource "http://localhost/Cookie2.php".

Requête 1 : redirection automatique avec transmission automatique du cookie correct
Requête 2 : redirection manuelle avec transmission automatique d'un cookie correct
Requête 3 : redirection manuelle avec transmission manuelle d'un cookie erroné
Requête 4 : redirection manuelle avec transmission manuelle d'un cookie correct
Requête 5 : redirection manuelle avec suppression du cookie (provoque une erreur 404)

Pour faire fonctionner ce programme, il faut (avec eclipse) :

- installer la librairie httpClient :
- télécharger les fichier les fichiers binaires (et sources) des codecs apache par défaut :
- http://jakarta.apache.org/commons/codec/
- télécharger les fichier les fichiers binaires (et sources) des gestionnaires de journalisation apache par défaut :
- http://jakarta.apache.org/commons/logging/
- télécharger les fichier les fichiers binaires (et sources) du client http apache :
- http://jakarta.apache.org/commons/httpclient/
- créer un répertoire java et 3 sous répertoires correspondants aux 3 sous projets apache
- commons-codec-1.3,
- commons-logging-1.1,
- commons-httpclient-3.1-rc1
- décompresser les fichiers jar, et éventuellement la documentation, dans leur répertoire respectif
- si les fichiers sources ont été téléchargés alors décompresser les sources dans un sous répertoire nommé src de chaque sous projet
- dans l'explorateur de projet d'eclipse, créer un nouveau projet nommé redirectCookie (vérifier la compatibilité jre 5.0 minimum) -> Suivant
- dans l'onglet Librairies, créer et associer au projet 3 variables pointant les fichiers jar des 3 sous projets :
(Onglet bibliothèque->Ajouter une variable->Configurer les variables->Nouveau)
- COMMONS_CODEC vers java/commons-codec-1.3/commons-codec-1.3.jar
- COMMONS_LOGGING vers java/commons-logging-1.1/commons-logging-1.1.jar
- HTTPCLIENT vers java/commons-httpclient-3.1-rc1/commons-httpclient-3.1-rc1.jar
- si la documentation a été décompressée,
faire un attachement de la documentation à chaque variable du projet : COMMONS_CODEC, COMMONS_LOGGING et HTTPCLIENT
(Menu contextuel de la variable->Propriétés->Emplacement javadoc->Parcourir puis choisir le répertoire contenant la documentation de l'api)
- si les fichiers sources ont été téléchargés, créer 3 variables indiquant les répertoires où les sources ont été décompressés
- COMMONS_CODEC_SRC vers java/commons-codec-1.3/src
- COMMONS_LOGGING_SRC vers java/commons-logging-1.1/src
- HTTPCLIENT_SRC vers java/commons-httpclient-3.1-rc1/src
faire un attachement de fichiers sources à chaque variable du projet : COMMONS_CODEC, COMMONS_LOGGING et HTTPCLIENT
(Menu contextuel de la variable->Propriétés->Connexion source java->Variable puis choisir la variable associée aux sources)
- importer le fichier redirectCookie.jar contenu dans le fichier redirectCookie.zip dans le projet nouvellement créé
- installer et démarrer un serveur local supportant le php (easyphp : http://www.easyphp.org/, par exemple).
- copier les deux fichiers php (Cookie1.php et Cookie2.php) à la racine de ce serveur.
- compiler et lancer le programme principal

Le programme est composé de 3 classes :

- La classe HttpConstants contient des types utiles et des constantes pour le fonctionnement par défaut.
- La classe GetPostClient gére une communication multi requêtes par des méthodes GET et POST associées au client Http.
Elle permet de construire une gamme de clients http aux fonctionnalités plus spécifiques.
Elle permet de construire des url précises à l'aide de composants par défaut
Elle permet de localiser les erreurs Http courantes lors des requêtes sans empêcher leur fonctionnement.
- La classe CookieClient est un client de type GetPostClient orienté sur la gestion de communication avec cookies.

Source / Exemple :


package clients;

import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.cookie.CookiePolicy;

import commons.GetPostClient;
import commons.HttpConstants;
import commons.HttpConstants.MethodType;

public class CookieClient extends GetPostClient {

	/**

  • urls source et cible de la redirection
  • /
private static final String SOURCE_URL = "http://localhost/Cookie1.php"; private static final String REDIRECT_URL = "http://localhost/Cookie2.php"; /**
  • nom du cookie utilisé lors de la communication
  • /
private static final String COOKIE = "Test"; /**
  • composants par défaut d'une url
  • /
private static final String PROTOCOL = HttpConstants.DEFAULT_PROTOCOL; private static final String USER = HttpConstants.DEFAULT_USER; private static final String PASS = HttpConstants.DEFAULT_PASS; private static final String HOST = HttpConstants.DEFAULT_HOST; private static final int PORT = HttpConstants.DEFAULT_PORT; private static final String PATH = HttpConstants.DEFAULT_PATH; private static final String FILE = HttpConstants.DEFAULT_FILE; private static final String QUERY = HttpConstants.DEFAULT_QUERY; private static final String REFERENCE = HttpConstants.DEFAULT_REFERENCE; /**
  • Constructeur par défaut
  • l'url par défaut est "http://localhost/", port 80.<br/>
  • la méthode par défaut est de type GET
  • /
public CookieClient() { super(MethodType.GET, PROTOCOL, USER, PASS, HOST, PORT, PATH, FILE, QUERY, REFERENCE, null); } /**
  • Exemple d'ajout de cookie non sécurisé au contexte d'une communication
  • <br/>issue d'un programme de demonstration de la librairie HttpClient
  • <br/>modifié pour insérer le cookie en conservant le contexte de communication du client
  • @param domain domaine de validité du cookie
  • @param name nom du cookie
  • @param value valeur du cookie
  • /
public void addCookie(String domain, String name, String value) { // Initial set of cookies can be retrieved from persistent storage and // re-created, using a persistence mechanism of choice, Cookie cookie = new Cookie(domain, name, value, "/", null, false); // add coookie to current state getState().addCookie(cookie); // RFC 2101 cookie management spec is used per default // to parse, validate, format & match cookies getParams().setCookiePolicy(CookiePolicy.RFC_2109); // A different cookie management spec can be selected // when desired //httpclient.getParams().setCookiePolicy(CookiePolicy.NETSCAPE); // Netscape Cookie Draft spec is provided for completeness // You would hardly want to use this spec in real life situations //httppclient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY); // Compatibility policy is provided in order to mimic cookie // management of popular web browsers that is in some areas // not 100% standards compliant } /**
  • Recherche d'un cookie par son nom dans le contexte du client
  • @param name nom du cookie recherché
  • @return cookie correspondant ou null si le cookie n'existe pas
  • /
private Cookie getCookie(String name) { for (Cookie cookie : getState().getCookies()) if (cookie.getName().equals(name)) return cookie; return null; } /**
  • Point d'entrée du programme
  • @param args arguments de la ligne de commande
  • /
public static void main(String[] args) { // client de la communication CookieClient client = new CookieClient(); // Lecture du contenu d'une url par redirection depuis une première url // avec transmission d'un cookie // Requête 1 : redirection automatique avec transmission automatique du cookie correct // Requête 2 : redirection manuelle avec transmission automatique d'un cookie correct // Requête 3 : redirection manuelle avec transmission manuelle d'un cookie erroné // Requête 4 : redirection manuelle avec transmission manuelle d'un cookie correct // Requête 5 : redirection manuelle avec suppression du cookie (provoque une erreur 404) for (int i = 0; i < 5; i++) { System.out.println("Requête " + (i+1) + "\n"); // url source client.initMethod(SOURCE_URL); // initialisation du comportement lors des redirections client.getMethod().setFollowRedirects(i == 0 ? true : false); // exécution de la requête pour lire le cookie String response = client.request(); if (client.getMethod().getFollowRedirects()) // cas 1 : redirection automatique System.out.println("Redirection automatique\n"); else { // autres cas : redirections manuelles System.out.println("La réponse avant la redirection manuelle de " +client.getURL()+" est ("+response.length() +" caractères reçus) :\n" + (response.length() == 0 ? "" : response)); // cas 2 : transmission automatique du cookie par contexte, rien à faire // cas 3 : transmission manuelle d'un cookie erroné if (i == 2) { Cookie cookie = client.getCookie(COOKIE); if (cookie != null) cookie.setValue("erreur"); } // cas 4 : redéfinition d'un cookie unique dans le contexte if (i == 3) { Cookie cookie = client.getCookie(COOKIE); client.getState().clearCookies(); if (cookie != null) client.addCookie(cookie.getDomain(), cookie.getName(), cookie.getValue()); } // cas 5 : suppression des cookies (provoque une erreur 404) if (i == 4) { client.getState().clearCookies(); } // url cible client.initMethod(REDIRECT_URL); // redirection avec le même client et son contexte de communication response = client.request(); } System.out.println("La réponse après la redirection " +(i == 0 ? "automatique de " : "manuelle vers ") +client.getURL()+" est ("+response.length() +" caractères reçus)" + (response.length() == 0 ? "\n" : " :\n\n"+response)); } } }

Conclusion :


Ce programme montre que les clients qui utilisent la librarie HttpClient ont la capacité de conserver un contexte de communication entre les requêtes et qui permet notamment la transmission automatique de cookies et d'autres informations de session.

Le fichier redirectCookie.zip sert à la consultation en ligne sur le site.
Le fichier redirectCookie.jar contenu dans le fichier redirectCookie.zip sert à l'installation.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.