Passer une page d'authentification web et garder la connexion - Java - Programmation
Marsh Posté le 14-08-2003 à 20:58:51
pour ca il faut que tu gère les cookies : lors de ta première requête, tu vas recevoir un cookies (headr = set-cookies ou un truc dans le genre). Il faut que tu renvoies ce cookie dans les headers de tes autres requêtes pour garder la session.
Marsh Posté le 14-08-2003 à 20:59:42
Thyast a écrit : pb de cookie ou javascipt non interprété probablement. |
Si c'est un pb de cookie, il faudrait que j'arrive à ouvrir une connexion sur la page suivante en spécifiant d'utiliser le cookie posé par la page d'authentification. Mais comment faire, si t'avais une piste, ca m'arrangerait bien.
Pour le javascript, je vois pas trop, car si y'avait du javascript non interprété, il serait tout de même transmit par le serveur je pense... et donc affiché à l'écran sous forme de code ...
Bref, maintenant que le pb est certainement localisé (cookie), comment y remédier ?
Merci pour vos futurs réponses.
Je ne pourrais revenir voir les réponses que demain, couchage tot à cause de job d'été oblige (6h du mat : dur dur d'être un facteur)
Marsh Posté le 14-08-2003 à 21:02:20
benou a écrit : pour ca il faut que tu gère les cookies : lors de ta première requête, tu vas recevoir un cookies (headr = set-cookies ou un truc dans le genre). Il faut que tu renvoies ce cookie dans les headers de tes autres requêtes pour garder la session. |
Merci, je vais essayer ça demain après-midi.
Bonne nuit à tous (ou plutot bon veillage très très tard)
Marsh Posté le 16-08-2003 à 18:29:05
Je sens que ces cookies vont me prendre la tête !!!
J'ai vu sur le net qu'on pouvait récupérer les cookies en ajoutant les packages javax.servlet.* et javax.servlet.http.* et en faisant :
// Recupere la session
HttpSession session = request.getSession(true);
Lorsque je compile, java me dit que les packages "does not exist". J'ai le jdk 1.3, c'est normal qu'ils n'y soient pas ?
C'est la bonne solution pour récupérer le cookie ?
J'ai vu aussi ceci :
Cookie[] cookies = request.getCookies();
Mais je vois pas trop la différence entre les cookies et une session...
Marsh Posté le 16-08-2003 à 20:50:01
tu confond tout ... ce que t'as lu c'est pour la programmation d'application web côté serveur (d'un site web quoi).
toi faut que tu gères ca à la mimine côté client en faisant comme je l'ai dit ...
sinon, cherche un truc tout fait genre ca : http://www.innovation.ch/java/HTTPClient/
Marsh Posté le 17-08-2003 à 11:16:36
benou a écrit : tu confond tout ... ce que t'as lu c'est pour la programmation d'application web côté serveur (d'un site web quoi). |
Salut Benou,
En fait, si je fais ça à la mano, j'ai besoin de rien ? Je veux dire d'aucune classe cookie ou autre ?
Si j'ai bien compris ce que tu veux me dire et les nouvelles infos que j'ai lu sur le net :
Je me connecte à la page de login, je récupère dans les headers de cette même page la ligne commençant par :
"Set-Cookie: IDENTIFIANT=XXXXXXXXXXXXXXXXXXXXXXX"
Ensuite, j'ouvre une connexion sur la page que je veux en spécifiant :
"GET ...
Cookie: IDENTIFIANT=XXXXXXX "
Mais le problème que j'ai je ne récupère qu'une ligne de header :
80 <-- HTTP/1.1 302 Found
_
Et ensuite plus rien, c'est là qu'il faudrait que je récupère le set-cookie, mais j'ai rien. Juste un curseur qui clignote...
Marsh Posté le 17-08-2003 à 11:30:25
C'est pas possible que tu te manges qu'une seule ligne en retour : si c'est un HTTP 302, y a forcément un header Location qui te dit vers quelle page aller.
Sinon, c'est quoi la page à laquelle tu essayes d'accéder et qui te retourne un 302 ?
oublie pas aussi que dans la page d'identification tu dois passer tous les champs du formulaire de la page d'identification. Y en a peut être d'autre que le login password. Et puis c'est aussi peut être important si ils sont passé en GET ou en POST ...
je serais toi, je ferais déjà des tests avec un bête telnet : ca ira plus vite que de passer par le prog java à chaque fois pour faire tes tests
edit : c'est ca pour les cookies : ca marche comme ca. Sauf que tu peux acvoir plusiers coolies d'affectés sur une même ligne Set-Cookie
Marsh Posté le 17-08-2003 à 11:54:56
benou a écrit : C'est pas possible que tu te manges qu'une seule ligne en retour : si c'est un HTTP 302, y a forcément un header Location qui te dit vers quelle page aller. |
Voila ce que j'obtient avec un telnet:
Code :
|
Donc apparement c'est mon prog java qui n'arrive pas à récupérer les headers... (Je vois pas trop pourquoi mais bon...)
Les headers choppés en telnet me redirige vers une page non_cookies.phtml... et j'ai pas de header set-cookie...
La page à laquelle j'essaie de me connecter est la page d'authentification log_membre.phtml, c'est elle qui retourne un 302.
Je vais regarder si y'a d'autres champs, et en POST aussi (mais je pourrais p'être plus passer les valeurs des champs dans l'URL...).
Je vais aussi rajouter un user-agent...
Marsh Posté le 17-08-2003 à 12:31:58
d'après ce que je comprend, la page d'identification s'attend déjà à recevoir un cookie => il faut que tu le récupère sur une page précédente, c'est à dire que tu fasses une touche sur la page d'avant juste pour récupérer le cookie et l'envoyer au moment de l'identification
Marsh Posté le 17-08-2003 à 14:14:44
Effectivement, je me suis connecté à la racine du site et je reçois déjà des cookies :
Code :
|
Je vais essayer de les faire passer aux pages suivantes... (tous ?, je pense que oui)...
et je sais pas trop encore si il faut faire une autre connexion, avec un autre socket... enfin, je vais tester et je vous tiens au courant.
Merci :-)
Marsh Posté le 17-08-2003 à 14:22:57
vaut mieux que tu fasses une autre socket ouais ! c'est plus simple.
et oui, il vat mieux que tu passes tous les cookies. Ils sont surement pas tous nécessaires, mais en les envoyant tous, t'es sûr que ca marche ...
Marsh Posté le 18-08-2003 à 12:25:43
benou a écrit : C'est pas possible que tu te manges qu'une seule ligne en retour : si c'est un HTTP 302, y a forcément un header Location qui te dit vers quelle page aller. |
J'ai pigé pourquoi je ne récupèrais qu'une seule ligne de header : C'est ma fonction de récupération de ligne qui foire (toujours !)
Ce qui est bizarre, c'est que lorsque je récupère les headers d'un serveur de test fait en java ca marche -> je récupère tout. Alors que si je récupère les headers sur le web ou easyphp, je récupère que la première ligne.
Ca dit venir d'un problème de fin de ligne je pense...
Plus qu'a trouver ce pb et j'approche du but !
Marsh Posté le 18-08-2003 à 22:45:51
Rrrrr, j'arrive pas à faire marcher cette fonction de réception de ligne...
(je reste dans le même topic car c'est toujours dans le même pb de connexion...)
Bon, alors mon pb est comme je l'ai dit juste au-dessus, que j'arrive à récupérer les headers d'un serveur web java de test mais pas des autres serveurs...
Mon code ressemble à ceci :
Code :
|
...
Code :
|
...
Code :
|
Code :
|
Alors si je fais le test avec le serveur web de test java, j'obtiens ca :
Code :
|
... bref, tout ce passe bien.
Alors qu'avec un autre serveur, voila ce que ca donne
Code :
|
et comme ca pendant des lustres...
J'ai mit des "On est dans ..." pour débugger mais je n'y suis pas arriver...
Je ne comprends pas pourquoi il attend et ne voit pas les autres lignes...
Si vous pouvez m'éclairer... ... ... merci !
Marsh Posté le 19-08-2003 à 08:36:40
tu te compliques la vie pour rien !!!
fait une bête lecture de flux !
Code :
|
Marsh Posté le 20-08-2003 à 22:41:41
benou a écrit : tu te compliques la vie pour rien !!!
|
Tu as raison, je complique tout... c'est qu'au départ, j'ai voulu reprendre du code tout fait, et au final, ca me rallonge et complique le tout...
Marsh Posté le 14-08-2003 à 18:42:49
Bonjour,
J'aimerais faire un programme qui se connecte à une page web pour récupérer des données (de la bourse) et les écrire dans un fichier.
J'ai fait des essais en local avec une page web normale, j'y suis arrivé.
Par contre, la page à laquelle il faudrait que je me connecte maintenant et qui est donc sur le web n'est accessible qu'après authentification ...
Voila mon problème : je n'arrive pas à passer cette authentification...
Page à laquelle je désire accéder : http://www.boursorama.com/index.phtml
Page d'authentification que je dois passer :
http://www.boursorama.com/log_memb [...] ssword=XXX
(Si je rentre le lien précédent directement dans mon navigateur , je suis directement redirigé sur la page que je désire -celle des données : index.phtml -)
Voici mon code :
import java.net.*;
import java.io.*;
import java.util.*;
//==========================
public class Pierre{
//==========================
static SocketClient sock ;
static String attendreEtLire ()
{
while (!sock.receptionEnCours())
Utilit.tempo (100) ;
return (sock.ligneRecue ()) ;
}
static void explorer (String serveur, String page)
{
// Connexion au serveur
sock = new SocketClient (serveur, 80) ;
sock.espionner(true) ;
// Envoi en-tête http serveur
sock.envoyerLigne ("GET /" + page + " HTTP/1.0" ) ;
sock.envoyerLigne ("" ) ;
// Lecture en-tête http envoyé par serveur
String ligne = "debut" ;
while (!ligne.equals("" ))
{
ligne = attendreEtLire () ;
} // while
// Lecture page HTMl envoyée par serveur
ligne = "Debut du fichier" ;
//on cherche le debut du tableau
while(ligne.toUpperCase().trim().indexOf("LISTE</B></A>" ) < 0)
{ligne = attendreEtLire () ;}
//quand on est au debut du tableau
if(ligne.toUpperCase().trim().indexOf("LISTE</B></A>" ) >= 0)
{
//on cree le fichier
FileWriter fw ;
PrintWriter ps ;
try
{
//pour ecrire dans le fichier
fw = new FileWriter("a_lire.html" ) ;
ps = new PrintWriter(fw);
//on affiche un debut de page html
ps.print("<html><body><table><tbody><tr>" ) ;
//tant qu'on est pas a la fin du tableau
while(ligne.toUpperCase().trim().indexOf("</TBODY></TABLE>" )<0)
{
//on lit et on affiche la ligne
ligne = attendreEtLire () ;
ps.print(ligne) ;
}//for
//finir la page
ps.print("</body></html>" ) ;
ps.close() ;
}//try
catch(IOException e)
{System.out.println(e.getMessage()) ;}
}//if
//finir la lecture de la page du serveur
while (!ligne.toUpperCase().trim().endsWith("</HTML>" ))
{ligne = attendreEtLire () ;}
//fermeture de la connexion
sock.close () ;
} // explorer
public static void main(String parametres [])
{
explorer ("www.boursorama.com", "log_membre.phtml?login=XXX&password=XXX" ) ;
} // main
} // Fin
et voila ce que j'ai si je trace la communication :
java Pierre
Connexion Socket[addr=www.boursorama.com/209.207.226.77,port=80,localport=1489]
80 --> GET /log_membre.phtml?login=XXX&password=XXX HTTP/1.0
80 -->
80 <-- HTTP/1.1 302 Found
Et pis rien après... et j'ai pas d'idées pour passer à la page index.phtml...
J'espère que quelqu'un pourra m'aider. Merci d'avance
PS J'ai remplacé mes logins et password par des XXX)
Message édité par jultey le 14-08-2003 à 19:08:59