2010-08-18 3 views
0

J'essaie de me connecter à un site Web (code source ci-dessous) qui nécessite une connexion, puis le parcourir pour télécharger des fichiers. J'ai réussi à le faire pour un autre site en utilisant ce code:Connectez-vous au site Web et gardez la session?

public void initConnection(String _path, Map<String,String> _parameters) throws IOException { 

    String data = convertMapToParams(_parameters); 

    // Send data 
    URL url = new URL(host + "/" + _path); 
    URLConnection conn = url.openConnection(); 
    conn.setDoOutput(true); 

    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 
    wr.write(data); 
    wr.flush(); 
    wr.close(); 

    sessionCookie = conn.getHeaderField("Set-Cookie"); 
    sessionCookie = sessionCookie.substring(0,sessionCookie.indexOf(";")); 
} 
public List<String> getHtml(String _path, Map<String, String> _parameters) throws IOException { 

    String data = convertMapToParams(_parameters); 

    URL url = new URL(host + "/" + _path); 
    HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
    conn.setDoOutput(true); 

    conn.setRequestProperty("Cookie", sessionCookie); 

    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 
    wr.write(data); 
    wr.flush(); 
    wr.close(); 

    List<String> list = new LinkedList<String>(); 

    BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
    String line; 
    while ((line = rd.readLine()) != null) { 
     list.add(line); 
    } 

    rd.close(); 

    return list; 
} 

Le problème est que sur ce site, quand je fais ceci:

sessionCookie = conn.getHeaderField("Set-Cookie"); 

Je reçois SessionCookie == « null », donc je ne suis pas en mesure d'obtenir des cookies pour garder la session ouverte. Et si je reçois les en-têtes de la variable conn pour vérifier s'il y a un champ de cookie là, je reçois ce (de IntelliJ débogueur IDEA):

[0] = {java.util.Col[email protected]2085}"null=[HTTP/1.1 200 OK]" 
[1] = {java.util.Col[email protected]2093}"X-AspNet-Version=[2.0.50727]" 
[2] = {java.util.Col[email protected]2102}"Date=[Wed, 18 Aug 2010 07:32:37 GMT]" 
[3] = {java.util.Col[email protected]2111}"Content-Length=[3686]" 
[4] = {java.util.Col[email protected]2120}"Content-Type=[text/html; charset=utf-8]" 
[5] = {java.util.Col[email protected]2129}"Server=[Microsoft-IIS/6.0]" 
[6] = {java.util.Col[email protected]2138}"X-Powered-By=[ASP.NET]" 
[7] = {java.util.Col[email protected]2147}"Cache-Control=[private]" 

Mais l'utilisation de Firefox add-on « HttpFox » pour vérifier si il y a des cookies, je découvre qu'il ya:

(Request-Line) POST /companias/entrada.aspx HTTP/1.1 
User-Agent Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/;q=0.8 
Accept-Language es-es,es;q=0.8,en-us;q=0.5,en;q=0.3 
Accept-Encoding gzip,deflate 
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive 115 
Connection keep-alive 
Cookie __utma=235757843.1141928071.1280949246.1282083861.1282114987.11; __utmz=235757843.1280949246.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmc=235757843 
Content-Type application/x-www-form-urlencoded 
Content-Length 381 

Une autre chose qui me confondaient ces champs dans le code source "__VIEWSTATE", "__EVENTVALIDATION", "__EVENTTARGET", "__ LASTFOCUS" et "__EVENTARGUMENT". Parce que j'ai recherché des informations à leur sujet et si j'ai bien compris, vous pouvez utiliser VIEWSTATE pour contrôler la session de l'utilisateur mais je ne sais pas comment cela fonctionne. Donc, pour faire court, sur un autre site j'ai utilisé ce simple "getheaderField (" Set-Cookie ")" pour obtenir le cookie et maintenir la session en vie, mais maintenant je ne sais pas si le site utilise des cookies ou si ce n'est pas le cas et je ne sais pas si les cookies seraient la solution ou si je devais plutôt utiliser ce champ VIEWSTATE pour le faire.

Je ne suis pas très expérimenté avec Java et encore moins avec les choses de connexion, j'ai été recommandé ici pour utiliser Apache HttpClient pour ce genre de choses et je lis à ce sujet, mais j'ai tellement de choses en commun d'abord besoin de savoir le chemin à parcourir avec ce site.

Et enfin, cela fait partie du code source de ce site:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 

    <head><title> 
    Steps Peritaciones S.L. 
</title><link href="../Styles/general.css" rel="stylesheet" type="text/css" /> 
     <style type="text/css"> 
     </style> 
    </head> 

    <body> 
     <form name="form1" method="post" action="entrada.aspx" onsubmit="javascript:return WebForm_OnSubmit();" id="form1"> 

<div> 
<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" /> 
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /> 
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" /> 
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJODcxMzI1MDYzZBgBBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WAQUbTG9naW5TdGVwcyRMb2dpbkltYWdlQnV0dG9udl7bDlN22j9J5Z5UXZi+FLbU6hk=" /> 
</div> 

<script type="text/javascript"> 
//<![CDATA[ 
var theForm = document.forms['form1']; 
if (!theForm) { 
    theForm = document.form1; 
} 
function __doPostBack(eventTarget, eventArgument) { 
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) { 
     theForm.__EVENTTARGET.value = eventTarget; 
     theForm.__EVENTARGUMENT.value = eventArgument; 
     theForm.submit(); 
    } 
} 
//]]> 
</script> 

<div> 

    <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBAKZ/NOFAgK6jd26DgKovcvMBwKV8YLlBGCk0AytR6jZVZxOJwJ59H/uIN21" /> 
</div> 
      <div class="logoEntrada"> 
       <img src="../images/logo_steps_p.gif" alt="Steps Peritaciones S.L." /> 
      </div> 
      <div class="LoginForm" > 
       <br /> 
       <br /> 
       <span id="Label1" class="TitolEntrada">Acceso Compañias</span> 

       <br /> 
      </div> 
      <div class="LoginForm"> 
       <center> 
        <table class="LoginBox" cellspacing="0" cellpadding="4" border="0" id="LoginSteps" style="background-color:#E3EAEB;border-color:#E6E2D8;border-width:1px;border-style:Solid;border-collapse:collapse;"> 
    <tr> 
     <td><table cellpadding="0" border="0" style="color:#333333;font-family:Verdana;font-size:1em;width:234px;"> 
      <tr> 
       <td align="center" style="color:White;background-color:#1C5E55;font-size:1em;font-weight:bold;">Entrada</td> 

      </tr><tr> 
       <td><label for="LoginSteps_UserName">Usuario:</label></td> 
      </tr><tr> 
       <td><input name="LoginSteps$UserName" type="text" id="LoginSteps_UserName" style="font-size:1em;width:171px;" /><span id="LoginSteps_UserNameRequired" title="El nombre de usuario es obligatorio." style="color:Red;visibility:hidden;">*</span></td> 
      </tr><tr> 
       <td><label for="LoginSteps_Password">Contraseña:</label></td> 
      </tr><tr> 

       <td><input name="LoginSteps$Password" type="password" id="LoginSteps_Password" style="font-size:1em;width:171px;" /><span id="LoginSteps_PasswordRequired" title="La contraseña es obligatoria." style="color:Red;visibility:hidden;">*</span></td> 
      </tr><tr> 
       <td align="right"><input type="submit" name="LoginSteps$LoginButton" value="Entrar" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;LoginSteps$LoginButton&quot;, &quot;&quot;, true, &quot;LoginSteps&quot;, &quot;&quot;, false, false))" id="LoginSteps_LoginButton" style="color:#1C5E55;background-color:White;border-color:#C5BBAF;border-width:1px;border-style:Solid;font-family:Verdana;font-size:1em;" /></td> 
      </tr> 
     </table></td> 
    </tr> 
</table> 
       </center> 
      </div> 



<script type="text/javascript"> 
//<![CDATA[ 
var LoginSteps_UserNameRequired = document.all ? document.all["LoginSteps_UserNameRequired"] : document.getElementById("LoginSteps_UserNameRequired"); 
LoginSteps_UserNameRequired.controltovalidate = "LoginSteps_UserName"; 
LoginSteps_UserNameRequired.errormessage = "El nombre de usuario es obligatorio."; 
LoginSteps_UserNameRequired.validationGroup = "LoginSteps"; 
LoginSteps_UserNameRequired.evaluationfunction = "RequiredFieldValidatorEvaluateIsValid"; 
LoginSteps_UserNameRequired.initialvalue = ""; 
var LoginSteps_PasswordRequired = document.all ? document.all["LoginSteps_PasswordRequired"] : document.getElementById("LoginSteps_PasswordRequired"); 
LoginSteps_PasswordRequired.controltovalidate = "LoginSteps_Password"; 
LoginSteps_PasswordRequired.errormessage = "La contraseña es obligatoria."; 
LoginSteps_PasswordRequired.validationGroup = "LoginSteps"; 
LoginSteps_PasswordRequired.evaluationfunction = "RequiredFieldValidatorEvaluateIsValid"; 
LoginSteps_PasswordRequired.initialvalue = ""; 
//]]> 
</script> 


<script type="text/javascript"> 
//<![CDATA[ 

var Page_ValidationActive = false; 
if (typeof(ValidatorOnLoad) == "function") { 
    ValidatorOnLoad(); 
} 

function ValidatorOnSubmit() { 
    if (Page_ValidationActive) { 
     return ValidatorCommonOnSubmit(); 
    } 
    else { 
     return true; 
    } 
} 
     WebForm_AutoFocus('LoginSteps');Sys.Application.initialize(); 

document.getElementById('LoginSteps_UserNameRequired').dispose = function() { 
    Array.remove(Page_Validators, document.getElementById('LoginSteps_UserNameRequired')); 
} 

document.getElementById('LoginSteps_PasswordRequired').dispose = function() { 
    Array.remove(Page_Validators, document.getElementById('LoginSteps_PasswordRequired')); 
} 
//]]> 

Merci et j'espère que son code pas trop dans un poste: S

PD: Ce site Web appartiennent à mon travail et j'ai un accès autorisé à eux, donc ce n'est pas une chose de piratage, je veux juste automatiser le processus et apprendre pendant que je suis dessus

Répondre

3

OMG, vous faites tout à la main? Je vous suggère plutôt d'utiliser HtmlUnit, car il vous permet d'utiliser un client Web virtuel, avec toutes ses fonctionnalités, et une API de plus haut niveau vous permettant de vous concentrer sur l'interaction avec le site, au lieu d'ouvrir les flux manuellement.

+0

-1 parce que ce n'est pas vraiment une réponse er. C'est une chose de dire "le problème est x, mais je vous recommande de le faire". C'est une autre chose à dire "omg c'est trop dur, je fais juste y". –

+0

EN PARTICULIER parce que cette question était très spécifique. C'est-à-dire, la gestion des sessions/cookies. Votre réponse a complètement échoué à répondre à cette question spécifique. –

+0

Oui, bien sûr, sauf que la gestion de session/cookie est une chose difficile à faire à la main, que HtmlClient gère avec précision avec facilité. – Riduidel

Questions connexes