httpPOST form mit Java submitten

  • Hi,
    aus gegebenem Anlass bastel ich mir in der Uni gerade einen eigenen Browser mit Java (wäh Java).
    Dieser kann inzwischen schon eine Menge (außer Dinge schön anzeigen, läuft rein über die Konsole), jetzt will ich mich auch bei webseiten anmelden können. Tut aber bisher nicht.

    mein Problem ist das ich keine Ahnung hab an welcher Stelle es schief geht und warum. Vlt. hat ja jemand eine Idee wie ich das hinbekommen kann. Die Webseite bei der ich mich einloggen will hat in etwa follgenden Code:

    Code
    <div class="login-block">	<form action="index.php?action=login&amp;server_list=1" method="post" id="login_form" onsubmit="return Index.login_submit();">		<label for="user">			<strong >Benutzername:</strong>			<span >				<input id="user" name="user" class="text" type="text" value = "" onkeydown="if((e=window.event||event) && e.keyCode == 13 && $('#user').val() && $('#password').val()) $('#login_button').trigger('click');"/>			</span>		</label>		<label for="password">			<strong >Passwort:</strong>			<span >				<input name="clear" type="hidden" value="true" />				<input id="password" name="password" class="text" type="password"  onkeydown="if((e=window.event||event) && e.keyCode == 13 && $('#user').val() && $('#password').val()) $('#login_button').trigger('click');"/>			</span>		</label>		<div id="non_script_login">			<label for="server_select" id="server_select_label">				<strong >Server:</strong>				<select id="server_select" class="server_select" name="server" >					<option value="de" >de Server</option>					<option value="es" >es Server</option></select>			</label>			<input type="submit" id="login_button" value="Login"/>		</div>		<div id="js_login_button">			<a href="#" onclick="$('#login_button').trigger('click');" class="login_button">				<span class="button_left"></span>				<span class="button_middle">Login</span>				<span class="button_right"></span>				</a>		</div>                <label for="cookie" style="text-align:right;">			<input id="cookie" type="checkbox" name="cookie" value="true"  />Dauerhaft einloggen		</label>		</div>	</form></div>

    Jetzt wäre meine erste Frage, wie muss mein POST body aussehen? doch eigentlich etwa so:
    user=MyUsername&password=MyPassword&Server=de&clear=true&cookie=true

    ? oder verstehe ich da was völlig falsch?

    gesendet wird das dann in etwa so:

    Code
    prepareConnection();
    		connection.setDoOutput(true);
    		connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset);
    		OutputStream output = null;
    		try {
    			output = connection.getOutputStream();
    			output.write(query.getBytes(charset));
    			output.flush();

    wobei in prepareConnection natürlich noch eine Menge Kram steht. Cookies müssten theoretisch vielleicht auch sinnvoll funktionieren (habs noch nicht ausführlich getestet, sollte aber tun).

    all I can do is be me, whoever that is. -Bob Dylan

    Römer sind keine Bieber!

  • Was ich vlt. noch anmerken sollte, es scheint an sich zu funktionieren, die Verbindung etc. funktioniert, nur das ich halt einfach nicht angemeldet bin.

    all I can do is be me, whoever that is. -Bob Dylan

    Römer sind keine Bieber!

  • Puh, auf die Distanz echt schwer zu beantworten:

    1. Du musst natürlich sicherstellen, dass Cookies funktionieren. Das nur zu vermuten hilft kaum weiter. Wenn der Webserver die Session über Cookies handlet und Dein Browser die nicht speichert, ist's kein wunder wenn Du keinen eingeloggten State hinkriegst.
    2. Deinem kleinen Codesnippet (vielleicht mal kompletten Quelltext posten?) kann ich nicht entnehmen, dass Du auf HTTP-POST umgestellt hast. Ein erstes Googlen hat folgende Herangehensweise dafür entdeckt: http://extreme-java.blogspot.de/2011/04/how-to…st-in-java.html
    2.b) Deine Herangehensweise die Variablen zu transportieren sieht mir nach GET aus.
    3. Im JavaScript des Originalformulars könnte ja auch noch irgendeine Magic passieren - auch da würde der Quelltext helfen.

    Viel Raten mit so ner Blackbox - nur mit mehr Infos wird man Dir helfen können. ;)

    We are Microsoft of Borg. Assimilation is imminent. Resistance is... Error in Borg.dll. Press OK to abort.

  • Naja, zu Punkt 1: Cookies werden gespeichert, definitiv, nur ob wirklich jedes mal alle benötigten übermittelt werden hab ich noch nicht zu 100% sicherstellen können.

    zu 2. ja auf POST wird umgestellt.

    3. naja, das Problem ist das die Webseite um die es mir geht ziemlich unübersichtlich ist und ich nicht so ohne weiteres durchsteige. Ein paar Suchen haben bisher noch nix ergeben.


    Allgemein: der Code um mit den http Verbindungen um zu gehen ist einfach zu lang um den hier alles zu posten, muss ja auch alles korrekt encoded werden etc.

    Was ich jetzt versuchen werde: 1. andere webseiten testen ob da die anmeldungen klappen 2. den Cookie Manager gegen einen selbstgeschriebenen tauschen von dem ich dann auch wirklich weiß was er macht. 3. ein bisschen im Code rumspielen und testen um besser einschränken zu können wo im Code der Fehler auftauchen könnte.

    all I can do is be me, whoever that is. -Bob Dylan

    Römer sind keine Bieber!

  • Hallo,

    was ist mit 2.b)? Auch wenn Du die connection auf POST umgestellt hast, sieht Deine Parameterübergabe trotzdem noch nach GET aus. Hast Du die an die URL angehängt oder an irgendeine POST-Methode der Connection übergeben?

    Zu 3: Naja, aber JavaScript kann man ja einsehen. Ansonsten wäre noch eine komfortable Möglichkeit, die Website mit nem Firefox o.ä. zu bedienen, und ein Mal das Posten mit Firebug "mitzuschneiden". Dann hast Du danach den vollständigen POST im Netzwerktab zum Nachlesen.

    We are Microsoft of Borg. Assimilation is imminent. Resistance is... Error in Borg.dll. Press OK to abort.

  • Zu 3: Naja, aber JavaScript kann man ja einsehen. Ansonsten wäre noch eine komfortable Möglichkeit, die Website mit nem Firefox o.ä. zu bedienen, und ein Mal das Posten mit Firebug "mitzuschneiden". Dann hast Du danach den vollständigen POST im Netzwerktab zum Nachlesen.


    Würde ich auch empfehlen! Das hat mir damals massiv geholfen, als ich genau so etwas in Perl gebaut habe.

    1-6000-banner-88x31-jpg

    Stolzer Besitzer eines 3dfx Voodoo5 6000 AGP Prototypen:

    • 3dfx Voodoo5 6000 AGP HiNT Rev.A-3700

    [//wp.xin.at] - No RISC, no fun!

    QotY: Girls Love, BEST Love; 2018 - Lo and behold, for it is the third Coming; The third great Year of Yuri, citric as it may be! Edit: 2019 wasn't too bad either... Edit: 2020... holy crap, we're on a roll here~♡!

    Quote Bier.jpg@IRC 2020: "Je schlimmer der Fetisch, desto besser!"

  • Gute Idee mit dem mitschneiden, werde ich machen.

    zu 2b: da wird nix irgendwo angehängt. mit getOutPutStream() bekomme ich einen Stream zu schon längst eingegebenen URL, da sind dann HTTP Header etc. schon längst gelaufen und ich übertrage dann per POST meine Daten.

    all I can do is be me, whoever that is. -Bob Dylan

    Römer sind keine Bieber!

  • also, der Query String ist schonmal ziemlich genau das was ich vermutet hatte. (mit wireshark mitgeschnitten) ==> Eine mögliche Fehlerquelle weniger.

    all I can do is be me, whoever that is. -Bob Dylan

    Römer sind keine Bieber!

  • Ok, ich hab den Fehler, auch wenn ich noch keine Ahnung hab wie er entsteht:

    Es wird kein http POST gefeuert. Auch nichts stattdessen, die Seite wird sauber geladen, wenn ich dann meine Anmeldedaten übertragen will passiert erst mal gar nichts, keinerlei Kommunikation, und wenn ich danach die Seite erneut aufrufe um zu prüfen ob ich sauber eingeloggt bin wird wieder per GET die webseite angefordert.

    all I can do is be me, whoever that is. -Bob Dylan

    Römer sind keine Bieber!

  • OK, der Fehler ist soweit behoben. Als Antwort bekomme ich ein OK zurück und die Startseite im nicht eingeloggten Zustand. hmm

    all I can do is be me, whoever that is. -Bob Dylan

    Römer sind keine Bieber!