Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

REDIRECTION D'URL ET TRANSMISSION DE COOKIES


Information sur la source

Catégorie :Reseaux et Internet Classé sous : redirection, url, transmission, cookie Niveau : Débutant Date de création : 09/06/2007 Vu / téléchargé: 8 567 / 233

Note :
1,5 / 10 - par 2 personnes
1,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note


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

  • 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));
  • }
  • }
  • }
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.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de petifa le 07/07/2007 22:49:55

lol il y a beaucoup de choses a faire pour faire fonctionner ce programme
il faudrait presaue faire un programme pour faire ca  !!!
petifa

signaler à un administrateur
Commentaire de AlexN le 09/07/2007 21:16:46

:o) c'est parce que ce petit programme utilise une librairie externe (httpclient) et que j'ai ajouté tout le détail de l'insertion de cette librarie.
C'est vrai que ça peut paraitre long mais ça prend moins de 10 minutes, moins de temps qu'il ne m'a fallu pour comprendre comment faire. Et une fois que la librairie est installée, elle peut resservir pour d'autres projets.

Petite correction à faire :

Il est préférable de faire une requête HEAD au lieu de GET, pour obtenir les cookies en limitant le trafic : le corps de la première réponse ne sert à rien dans les redirections manuelles et souvent l'url de redirection se trouve dans l'entête de la réponse (propriété location).

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

PROG-Zone, la programmation sous tous les langages [ par sebrs1 ] Salut à tous les développeurs, je viens de mettre en ligne mon tout nouveaux site qui servira à tout le monde quelque soit le langage dans lequel vous applet + servlet + redirection [ par chris90 ] BonjourJ'ai une applet qui réalise un HTTP Tunneling(URLConnection,....) vers une Servlet (serveur Tomcat ). La servlet traite les infos transmises pa afficher le resulta d'une url dans un JJtabbedPane [ par doko ] bonjour a tous! Voila j'ai un programe qui envoi une requete a une URL precise et j'ai une réponse que j'aimerai afficher dans un JTabbedPane en temps ouvrir une URl à partir d'un bouton [ par pmithrandir ] je voudrais savoir comment ouvrir une paga HTMLen cliquant sur un bouton!!!merci de me mettre le code source Servlet qui vérifie une date et si ok, ça éxécute une url [ par jbrek ] Bonjour,en faite, je developpe un site en php. Dans mon site (www.animeworld-fr.com/index.php), j'ai créé un espace membre. Les inscrits doivent confi Problm applet + TextField [ par TontonLuc ] Cette Applet redescend le contenu d'un fichier .txt qui se trouve sur le Net mais ça marche uniqmt lorsque je lance l'Applet d'une fenêtre Dos. J'aime Applet et JFrame + AppletContext [ par TontonLuc ] J'arrive à ouvrir 1 fichier d'une applet grace au code suivant.Question : je voudrais effectuer la même chose mais d'une JFrame. Comment fait-on ?try{ Sound [ par Aldee ] Salut,Je veux faire une application qui lit un fichier .wavJ'ai bien trouvé dans le forum des bribes de réponses et même un source..mais pour applet p Ajout d'une source [ par SLaYerS ] Voila je n'arrive pas a ajouter une source, est ce moi qui est tres fatiguer ou le site qui a un bug ? :/-=(SLaYerS)=- Convertier un fichier BITMAP en JPEG [ par SLaYerS ] Voila je recherche, un code, un algorithme, un ActiveX enfin quelque chose qui pourrait m'aider pour pouvoir convertir un fichier bmp en jpg.Merci d'a


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,28 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.