1. #1

    Registriert seit
    07.02.2013
    Beiträge
    14
    Thanked 3 Times in 3 Posts

    Standard HttpURLConnection Problem

    Hallo Leute,
    habe ein Problem bei meinem Javaprogramm.
    Ich möchte für Browsergame eine Art Bot schreiben.
    Der Login läuft in 3 schritten ab.
    1. Browser sendet Username + Passwort an den Server
    2. Browser bekommt von der Seite das verhashtes(?) Passwort als Response
    3. Browser sendet Username + verhashtes Passwort an den Server
    4. Erfolg.

    Habe dies als erstes so gelöst:
    Spoiler:

    public static boolean login(String user, String pw){
    try{

    CookieHandler.setDefault(new CookieManager(null,CookiePolicy.ACCEPT_ALL));

    URL url = new URL(URL);
    HttpURLConnection uc = (HttpURLConnection)url.openConnection();
    uc.setRequestMethod("POST");
    uc.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
    uc.setRequestProperty("Content-Length", "" + Integer.toString((parameter).getBytes().length));
    uc.setRequestProperty("Content-Language", "en-US");
    uc.setUseCaches(false);
    uc.setDoInput(true);
    uc.setDoOutput(true);

    DataOutputStream wr = new DataOutputStream(uc.getOutputStream());
    wr.writeBytes(parameter);
    wr.flush();
    wr.close();

    BufferedReader rd = new BufferedReader(new InputStreamReader(uc.getInputStream()));
    String line;
    StringBuffer response = new StringBuffer();
    while((line = rd.readLine()) != null) {
    response.append(line);
    response.append('\r');
    }
    rd.close();


    pw = response.toString().split("\\\"")[22].replace("\\", "");

    url = new URL(URL);
    uc = (HttpURLConnection)url.openConnection();
    uc.setRequestMethod("POST");
    uc.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
    uc.setRequestProperty("Content-Length", "" + Integer.toString((parameter).getBytes().length));
    uc.setRequestProperty("Content-Language", "en-US");
    uc.setUseCaches(true);
    uc.setDoInput(true);
    uc.setDoOutput(true);


    wr = new DataOutputStream(uc.getOutputStream());
    wr.writeBytes(parameter);
    wr.flush();
    wr.close();

    rd = new BufferedReader(new InputStreamReader(uc.getInputStream()));
    line = "";
    response = new StringBuffer();
    while((line = rd.readLine()) != null) {
    response.append(line);
    response.append('\r');
    }
    rd.close();

    return loggedin = response.toString().toLowerCase().contains(blub);


    } catch (Exception e) {
    e.printStackTrace();
    }
    return loggedin;


    }


    Dies hat auch funktioniert allerdings habe ich hier schon 2 Mal im Prinzip den selben Codeblock, und im laufe des Programmes wird er noch öfter vorkommen.
    Also habe ich das ganze in eine Methode abgeschoben, wo ich nur den Parameter und die URL angeben muss.

    Dies sieht dann so aus:
    Spoiler:

    public String request(String uri, String parameter, boolean response){
    try{
    CookieHandler.setDefault(new CookieManager(null,CookiePolicy.ACCEPT_ALL));

    URL url = new URL(uri);
    HttpURLConnection uc = (HttpURLConnection)url.openConnection();
    uc.setRequestMethod("POST");
    uc.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
    uc.setRequestProperty("Content-Length", "" + Integer.toString((parameter).getBytes().length));
    uc.setRequestProperty("Content-Language", "en-US");
    uc.setUseCaches(false);
    uc.setDoInput(true);
    uc.setDoOutput(true);


    DataOutputStream wr = new DataOutputStream(uc.getOutputStream());
    wr.writeBytes(parameter);
    wr.flush();
    wr.close();

    if(response){
    BufferedReader rd = new BufferedReader(new InputStreamReader(uc.getInputStream()));
    String line;
    StringBuffer tmp = new StringBuffer();
    while((line = rd.readLine()) != null) {
    tmp.append(line);
    tmp.append('\r');
    }
    rd.close();
    return tmp.toString();
    }else{
    return "";
    }
    }catch(Exception ex){
    ex.printStackTrace();
    }
    return "";
    }


    Welche ich dann eben, z.B.: für den Loginvorgang 2 Mal aufrufe.
    Allerdings funktioniert der Login auf diese Weise nicht.
    Meldung bekomme ich von der Website, dass meine Session abgelaufen sei.
    Habe schon probiert uc global zu definieren hat, wie erwartet, nichts gebracht.

    Hoffe das mir jemand helfen kann.

  2. #2
    Avatar von DMW007
    Registriert seit
    15.11.2011
    Beiträge
    6.217
    Thanked 9.133 Times in 3.007 Posts
    Blog Entries
    5

    Standard AW: HttpURLConnection Problem


    CookieHandler.setDefault(new CookieManager(null,CookiePolicy.ACCEPT_ALL));

    Ich bin, u.a. aufgrund solcher Konstrukte, kein großer Fan von Java. In C# ist das meiner Ansicht nach viel sauberer gelößt. Da gibts eine Klasse CookieContainer, jedem HttpWebRequest-Objekt das dessen Cookies im Header senden und vorhandene speichern soll weist man den jeweiligen CookieContainer zu und fertig. Der CookieManager von Java scheint dasselbe Ziel zu verfolgen, aber deutlich umständlicher und unübersichtlicher. So wie es aussieht sammelt der die gesetzten Cookies zwar selbstständig aus dem Header, senden muss man sie aber manuell: Java: URLConnection und CookieManager | das blog für programmier-verzweifler Kannst du ja auch selbst relativ einfach testen, in dem du die Header deines Programmes anschaust und mit den Headern der originalen Requests vergleichst. Wenn ich Recht habe, sollten im zweiten Request Cookies vom ersten mitgesendet werden, die in deinem Programm fehlen.
    Ansonsten poste mal deinen eigentlichen Code der Funktionsaufrufe und deine Mitschnitte der Requests oder zumindest die URL der Seite.


  3. #3

    Registriert seit
    11.01.2013
    Beiträge
    32
    Thanked 8 Times in 7 Posts

    Standard AW: HttpURLConnection Problem

    Hallo,
    ich tippe mal, dass Dein Problem darin liegt, dass Du jeweils eine neue HTTP-Verbindung verwendest. Soetwas solltest Du, wenn möglich, vermeiden. In den meisten Fällen ist dieser Vorgang auch die langsamste und damit "kostenintensivste" Operation beim Request.
    Weiterhin ist auch die Verwendung einer ausgebauteren Komponente zu empfehlen (Apache HttpComponents - Apache HttpComponents). Dort sind auch viele Beispiele zu finden wie man das Ganze angeht.
    Noch ein Tip: die Verbindung auf alle Fälle aufrecht erhalten. Wenn Du das Ganze parallel aus mehrene Threads angehst empfehle ich die Verwendung einen Pools oder die asynchrone Verarbeitung. Dein Client wird es Dir danken :o)

Ähnliche Themen

  1. [W-Lan] Problem!
    Von Microsoft im Forum Hardware
    Antworten: 3
    Letzter Beitrag: 22.07.2012, 13:28
  2. Skype-Problem: Problem mit dem Wiedergabegerät
    Von Scarface im Forum Audio & Video
    Antworten: 0
    Letzter Beitrag: 16.07.2012, 23:58
  3. Problem?
    Von Bossgen im Forum OffTopic
    Antworten: 1
    Letzter Beitrag: 16.03.2012, 18:10
  4. [Problem] ICQ 7.7
    Von GENETIKK im Forum Sonstige
    Antworten: 4
    Letzter Beitrag: 17.12.2011, 14:19
  5. PS3 MW3 Problem
    Von rVs14 im Forum Sony PlayStation
    Antworten: 3
    Letzter Beitrag: 19.11.2011, 16:01
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.