Comment connaitre l'url de redirection d'une url

Résolu
Signaler
Messages postés
43
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
19 août 2009
-
Messages postés
43
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
19 août 2009
-
Bonjour,
j'ai un problème dans une application cliente je dois lire le contenu d'une page internet (la pas de problème) or le lien que j'appel renvoi sur une autre page (c'est là mon problème)
de ce fait mon 1er lien me retourne une erreur 404

exemple :

dans un navigateur cette page :
www.lien1.html

renvois à cette adresse :

www.lien2.html

 

j'ai capté cette adresse grace à un traceur html

 

ces 2 liens font le meme resultat dans le navigateur (propose d'ouvrir le document)

 

or dans java j'ai besoin de la 2eme adresse mais je ne connais que la 1ere.

 

sachant que la premiere adresse ne retourne rien (meme dans le traceur) elle ne fait que renvoyer sur le 2eme lien.

de ce fait  si je fais un :
            URL u = new URL(1erlien);
            URLConnection myConn = u.openConnection();
            BufferedReader br =
                new BufferedReader(new InputStreamReader( myConn.getInputStream()));

j'ai une erreur 404 (meme si je me crée une entête html)

 

je pense qu'avec un truk du genre myConn.Get...  je devrait trouver l'info donnant le forward ?

d'avance merci

NasserTom

10 réponses

Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
16
La classe HttpURLConnection dispose d'une méthode setFollowRedirect() qui permet de controler le comportement de la connection en cas de redirection.
Il faut le positionner à false pour empêcher la connection de suivre la redirection
Ensuite depuis la réponse du premier lien, il faut trouver le location="lien2" pour connaitre le lien de la redirection
Et ensuite faire la redirection manuellement si necessaire.
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
16
la redirection est généralement dans la page, mais elle peut se trouver à plusieurs endroits :

- dans une balise meta/refresh
<META HTTP-EQUIV="Refresh" CONTENT="5; URL=html-redirect.html">

- dans un script qui modifie la propriété location de la page courante : window.location.href = "html-redirect.html" (voir encore plus alambiqué)

- dans les règles du htaccess (avec apache comme serveur http) :

Redirect 301 /oldpage.html http://www.example.com/newpage.html

Mais dans ce dernier cas la redirection est prise en charge directement depuis le serveur et le client n'en a pas conscience.

Il n'existe malheureusement pas à ma connaissance de méthode qui retourne le lien de redirection (mais il faut fouiller la classe HttpUrlConnection). Il faut la trouver manuellement si tu veux reprendre le controle dessus.

Si tu veux avoir plus de controle sur la communication http, je te conseille vivement d'utiliser la librairie httpclient (http://jakarta.apache.org/commons/httpclient/) qui te permet entre autre de construire des entetes à ta sauce (notamment de modifier le user agent)
Messages postés
43
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
19 août 2009

bon j'ai trouvé grace à votre aides.

je laisse un exemple pour info :
//ajout d'information dans l'entête http cookie est un string
                connexion.addRequestProperty("User-agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705)");
                connexion.addRequestProperty("Cookie", cookie);

J'ai testé avec le traceur les données en parametre sont bien presente dans l'entêtes.

NasserTom
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
16
il est possible effectivement qu'il faille transmettre un cookie pour préserver des informations de session entre les redirections. Ton erreur 404 peut venir de là (le cookie attendu par le serveur n'est pas présent, et au lieu de t'envoyer une erreur de type 400, 401 il répond 404, mais là c'est un choix de celui qui a configuré le serveur).
Il existe une classe Cookie : http://java.sun.com/webservices/docs/1.5/api/javax/servlet/http/Cookie.html
Le httpclient gère également les cookies.
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
16
Tu trouveras un exemple ici http://www.javafr.com/codes/REDIRECTION-URL-TRANSMISSION-COOKIES_43051.aspx
Cet exemple utilise la librairie HttpClient au lieu d'utiliser directement les composants fournis par défaut (URL, HttpURLConnection ...)

Il faudra sûrement l'adapter à ta situation.
Messages postés
43
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
19 août 2009

Bonjour,
Personne n'a une idée ?
Si le browser est capable de faire cette redirection pourquoi ne puis je pas trouver comment il fait ?
Savez vous comment puis je lire l'entête html ? je pense que l'information relative à la redirection y est peut être.

D'avance merci

NasserTom
Messages postés
43
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
19 août 2009

Bonjour,
Merci AlexN pour cette ilustration de class abstraite que je connaisais mais sans savoir ce quelle apportait de plus que la class urlconnexion.

effectivement avec
connexion.setFollowRedirects(false); je n'ai plus de message d'erreur (mais je ne suis pas encore la redirection)
avec la valeur à true j'ai exactement le meme message que precedament.

savez vous comment puis je intéroger le location (que je sais voir uniquement avec un soft de trace html) car visiblement la redirection n'est pas dans la page html (pas dans getInputStream).

Autre question au sujet de HttpURLConnection.
la création de trame html est deprecate : .setDefaultRequestProperty("User-agent", "Mozilla/4.0");
j'ai pensé qu'elle etait remplacé par ceci : .addRequestProperty("User-agent", "Mozilla/4.0");
mais cela me génère une erreur.

D'avance merci

NasserTom
Messages postés
43
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
19 août 2009

Merci à tous pour ces informations,

pour la modification du user-agent il n'y a pas de problème (mon erreur etait que je ne la mettais pas au bon moment)

pour les informations de l'entête je sais les visualiser comme ceci :

                  for(int i = 1; i < 10; i++) {
                  System.out.println(connexion.getHeaderFieldKey(i) + " = " +
                  connexion.getHeaderField(i));
                  }

effectivement la redirection n'est pas dans l'entête !!
je pense qu'il me faudrait gérer les cooki comme le fait le browser.
savais vous comment puis je enregiser des cooki
il me s'emble que pour les lires ont utilise la commande suivante :
 System.out.println(connexion.getHeaderField("Set-Cookie"));

en tt cas merci pour toute l'aide que vous m'avez deja apporté.

si quelqu'un a plus d'info sur les cookis ?

PS : je vais aller consulter ce lien

Cordialement

NasserTom
Messages postés
43
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
19 août 2009

Bonjour,
Merci pour ces infos,

Je vais abuser, mais je debute en java, j'ai essenciellement fait du vb. et de ce fait je n'ai pas encore bien assimilé toutes les suptilitées de la programmation object.

et je t'avoue avoir beaucoup de mal à exploiter la javadoc.

Te serait il possible de me faire un exemple d'utilisation de cette class.
car je pense qu'elle est la clef de ce que je recherche.

dans mon cas j'ai utilisé la class httpurlconnexion qui me permet de valoriser la cookie dans mon entête html.

cette cookie je l'ai trouvé dans mon logiciel de trace. Celui ci risque de changer avec le temps (ce serait dommage de modifier le code à chaque modif)

je pense qu'avec cette class je peux recup les cookies et les ajouté dans l'entête.

faut il que je la combine à httpurlconnexion ?

le truc est sensé faire
appel du lien 1 avec une cookie (je ne sais pas d'ou elle vient) et si elle est presente il me forward vers le 2eme lien.

le cookie que j'ai dans mes traces resemble à cela ?

        String cookie = "__utma=213768855.676587401.1180808563.1180824555.1180831628.3; __utmz=213768855.1180831628.3.3.utmccn=(organic)|utmcsr=google|utmctr=mon+site|utmcmd=organic; last_folder=0";

D'avance merci

NasserTom
Messages postés
43
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
19 août 2009

Bonjourn AlexN,

un tres grand merci pour ton aide. je vais etudier ton code de tres pres.

NasserTom