Daten/Formular per POST an Firefox/Browser senden

Nisbo

Bekanntes Mitglied
Servus,

mit

Java:
Desktop.getDesktop().browse(new URI("https://www.meine-domain.de/record.php?mode=new&day=6&month=6"));

kann man ja den Browser öffnen und eine URL aufrufen, GET Parameter werden dabei ja übergeben, nur wie mache ich das mit POST wenn die Daten direkt an den Browser geschickt werden sollen ?

Hintergrund:
Wir müssen bei uns auf Arbeit die Arbeitszeiten im Intranet eintragen, dazu müssen wir uns über https mit Benutzernamen und Passwort einloggen und zusätzlich noch einen Token eingeben der uns auf einem Autentikator angezeigt wird. Somit fällt dann eine JavaInterne Lösung meines Erachtens nach aus.

Der Plan ist somit sich im Intranet einzuloggen und den Browser geöffnet zu lassen um dann mittels dem JavaProgramm die Daten per POST an den Server zu schicken.

Hat jemand eine Idee ?
 
Der httpclient natürlich ne feine Sache wenn man nicht noch die Sache mit dem zusätzlichen Token (Extra Gerät was ne Nummer/Code generiert) nach dem normalen Login auf einer neuen Seite hätte.

Ich nutze das Google Login Beispiel von hier
http://www.mkyong.com/java/apache-httpclient-examples/
und habe die URL angepasst sowie auch die Form Parameter erweitert und angepasst

Wenn ich das jetzt teste dann bekomme ich immer:
Response Code : 302 was eine Serverweiterleitung ist

Java:
Sending 'POST' request to URL : https://secure.domain.com/dana-na/auth/url_default/login.cgi
Post parameters : [tz_offset=, username=username, password=password, btnSubmit=Sign In, realm=Only Webmail and Intranet]
Response Code : 302


Jetzt weiß ich allerdings immer noch nicht ob das Login Erfolgreich war und es sich dann um die Seite zur Eingabe vom Token handelt oder ob es wieder die Loginseite ist. Der Response Code : 302 erscheint bei richtiger und falscher Eingabe vom Usernamen/Password

Ansonsten habe ich dann vermutlich (bin gerade zu Hause) auf Arbeit dann das Problem das es dort nicht funktionieren wird da unsere Rechner einen Proxy verwenden und ich dann dort den System Proxy nutzen müsste (ohne den Proxy im Java Programm manuell fest zu konfigurieren)

Dazu hatte ich auch schon mal eine Frage gestellt aber leider keine Antwort erhalten
http://www.java-forum.org/thema/system-proxy-verwenden.173649/

Momentan habe ich das jetzt so gelöst das ich mit die ausgefüllten Formulare als HTML Seite generiere, diese dann im Browser öffne und wo ich dann nur noch jeweils auf Submit beim gewünschten Tag klicken muss.
 
Wenn ich das jetzt teste dann bekomme ich immer:
Response Code : 302 was eine Serverweiterleitung ist


Jetzt weiß ich allerdings immer noch nicht ob das Login Erfolgreich war und es sich dann um die Seite zur Eingabe vom Token handelt oder ob es wieder die Loginseite ist. Der Response Code : 302 erscheint bei richtiger und falscher Eingabe vom Usernamen/Password
im Header steht als Location der neue Pfad, den dann einfach wieder öffnen, und am Content der Seite entscheiden, ob erfolgreicher Login.


Ansonsten habe ich dann vermutlich (bin gerade zu Hause) auf Arbeit dann das Problem das es dort nicht funktionieren wird da unsere Rechner einen Proxy verwenden und ich dann dort den System Proxy nutzen müsste (ohne den Proxy im Java Programm manuell fest zu konfigurieren)

Starte dein Programm einfach über eine .bat oä und gib der JVM die entsprechenden Parameter mit 😉

http://docs.oracle.com/javase/8/docs/technotes/guides/net/proxies.html
 
Ein
Java:
System.out.println(response.getAllHeaders());
gibt mir ein
org.apache.http.conn.EofSensorInputStream@add0edd
 
Ein
Java:
System.out.println(response.getAllHeaders());
gibt mir ein
org.apache.http.conn.EofSensorInputStream@add0edd
Joa, da wurde wohl toString nicht überschrieben, ist auch nicht sehr überraschend.

Dich interessiert aber in dem Fall auch nur ein Header, alle Header zu holen bringt also auch nicht viel. Es gibt sicher einen getter für einzelne Header.
 
Also ich kann jetzt zwar die Seite zur Eingabe des Tokens auslesen aber wenn dann das Formular abgeschickt wird dann failed der secondary login

Das hier ist das Formular zur Token-Eingabe
HTML:
<form id="frmDefender_6" name="frmDefender" action="login.cgi" method="POST" autocomplete="off">
<input id="username_8" type="hidden" name="username" value="MEINUSERNAME">
<input id="key_11" type="hidden" name="key" value="state_5280d00d8a6177c97d420bb9d342e6c0">
<table id="table_Defender_7" border="0" cellspacing="0" cellpadding="2">
    <tr>
        <td>Response:</td>
        <td><input id="password_5" type="password" name="password" size="20"></td>
    </tr>
    <tr>
        <td colspan="2">&nbsp;</td>
    </tr>
    <tr>
        <td>&nbsp;</td>
        <td>
            <input id="btnAction_3" type="submit" value="  Sign In  " name="btnAction" onclick="return (document.frmDefender.password.value != '');">
            <input id="secidactionCancel_2" type="submit" value="Cancel" name="secidactionCancel">
        </td>
    </tr>
</table>
</form>
Wobei:
key - wohl die Session ist
username - mein Benutzername
password - in dem Fall das Token ist
Als Output bekomme ich
Java:
Sending 'POST' request to URL : https://secure.domain.com/dana-na/auth/url_default/login.cgi
Post parameters : [username=MEINUSERNAME, key=state_5280d00d8a6177c97d420bb9d342e6c0, password=12345678, btnAction=  Sign In  , secidactionCancel=Cancel]
Response Code : 302
------> https://secure.domain.com/dana-na/auth/url_default/welcome.cgi?p=failed&auth=2

Als Fehlermeldung im Web würde bei der URL Secondary Login fehlgeschlagen erscheinen

Methode um die Parameter auszulesen
Java:
  public List<NameValuePair> getFormParamsToken(
          String html, String username, String password)
            throws UnsupportedEncodingException {

    System.out.println("Extracting form's data Token...");

    Document doc = Jsoup.parse(html);

    Element loginform = doc.getElementById("frmDefender_6");
    Elements inputElements = loginform.getElementsByTag("input");

    List<NameValuePair> paramList = new ArrayList<NameValuePair>();

    for (Element inputElement : inputElements) {
        String key = inputElement.attr("name");
        String value = inputElement.attr("value");

        if (key.equals("username")){
            value = username;
        }
           
        else if (key.equals("password")){
            value = javax.swing.JOptionPane.showInputDialog( "Token?" );
        }

        paramList.add(new BasicNameValuePair(key, value));
    }

    return paramList;
}

Nun bin ich mit meinem Latein am Ende :/
 

Zurück
Oben