Java : Verbindung mit httpclient scheitert an der Benutzeranmeldung

Cybered

Admiral Special
Mitglied seit
22.09.2002
Beiträge
1.625
Renomée
14
Standort
Unimatrix-Zero
Hallo,
versuche mit einem Programm Logfiles aus einer Steuerung zu ziehen.
Allerdings scheitere ich an der Benutzeranmeldung, im Browser ist ein weiteres Fenster das aufgeht, wo man Benutzername und passwort eingeben muß. Mein erster Ansatz war

Code:
public static InputStream openAuthorizedStream( URL url, String name, String passwd ) throws IOException
  {
    URLConnection verbindung = url.openConnection();
    verbindung.setDoInput( true );
    verbindung.setRequestProperty( "Authorization", userNamePasswordBase64(name,passwd) );
    verbindung.connect();
    return verbindung.getInputStream();
  }
 
  private static String userNamePasswordBase64( String username, String password )
  {
    String s = username + ":" + password;
    String encs = new sun.misc.BASE64Encoder().encode(s.getBytes());
    return "Basic " + encs;
  }

URL url = new URL( "http://192.168.1.10/func/setup/getlog" );
    BufferedReader Eingabestream = new BufferedReader( new InputStreamReader(openAuthorizedStream( url, "Benutzer", "Passwort" )) );


Das hat auch funktioniert. Da ich aber keinen Weg gefunden habe, Parameter mit der POST Methode zu übertragen, habe ich alles umgeschrieben und nutze nun den httpclient...das sieht dann so aus

Code:
 HttpClient client = new HttpClient();
   
   Credentials defaultcreds = new UsernamePasswordCredentials("Benutzer", "Passwort");
   client.getState().setCredentials(new AuthScope("192.168.1.10", 80, AuthScope.ANY_REALM), defaultcreds);
   
     //Versuch mit NameValuePair 
        PostMethod post = new PostMethod("http://192.168.1.10/func/setup/getlog");
            NameValuePair[] data = {
                new NameValuePair("startdate", "2008-09-11 00:00:00"),
                new NameValuePair("enddate", "2008-09-12 00:00:00"),
                new NameValuePair("dummy", "1221121089"),
                new NameValuePair("action", "Search")
                                          };
                post.setDoAuthentication( true );

Es ist nicht möglich sich mit der Seite zu verbinden...als "Fehlermeldung" meldet der httpclient ->

05.11.2008 19:20:22 org.apache.commons.httpclient.auth.AuthChallengeProcessor selectAuthScheme
INFO: basic authentication scheme selected

Ich hänge voll und weiß noch nicht ob ich überhaupt in die richtige Richtung gehe, da ich nun wirklich nicht der Java König bin und ich das ganze in 2 Wochen am laufen haben muß, ich bin also für jeden Tip dankbar...
thx4all
Cybered
 
Ich bin auch kein Java-Guru, habe aber ein bisschen mit (Http)URLConnection zu tun gehabt und kann das eigentliche Problem noch nicht so richtig verstehen.

1) In beiden Fällen benutzt du POST. Was heißt "keinen Weg gefunden, Parameter mit der POST Methode zu übertragen"? Parameter werden bei POST mit der von dir bereits verwendeten Methode setRequestProperty gesetzt.

2) Das 2. Code-Beispiel ist nicht vollständig, es fehlt der Abschnitt wo du die zusammengebaute NameValuePair[]-Struktur benutzt.

3) Im ersten Fall übergibst du Benutzername und Passwort als HTTP-Parameter, im 2. benutzt du eine extra Methode zum Setzen der Anmeldeinformationen (Credentials). Ob die beiden Wege unter der Haube das Gleiche produzieren weiss ich nicht. Und wenn du das auch nicht weisst, dann setzte doch im 2. Code die Sachen genau so, also Base64-kodiert in ein NameValuePair.
 
Ich weiß nicht, wann im Programmcode die Parameter für das Formular (Datumsangabe) zu übertragen sind, das kann ich ja noch nicht beim Aufruf machen...da werden ja erst mal Benutzername und Passwort erwartet.
Und wenn das erledigt ist, dann komme ich auf die Formularseite und dann muß ich die anderen Werte übertragen und das Ergebniss, was vom Server kommt wegspeichern.

Cybered
 
Du hast aber geschrieben dass die Benutzeranmeldung beim Code 1 "funktioniert" hat. Wie kommst du zu dieser Aussage, wie hat sich das technisch geäußert genau?
 
Der Webserver stellt immer ein aktuelles Logfile zur Verfügung, das geht von 0:00 Uhr bis zum Zeitpunkt wenn ich es abrufe, sagen wir 8:00 Uhr. Dieses Logfile kann ich mir mit dem Programm runterladen und abspeichern. Das würde ja nicht funktionieren, wenn ich nicht angemeldet wäre (mit Benutzername/Passwort). Auf der Webseite des Servers wird also das "Aktuelle" Logfile angezeigt und zusätzlich noch 2 Felder für ein "vergangenes" Datum + ein "Submit" Button.
Und genau in diese Felder will ich dann ausfüllen mit dem Datum von gestern 0:00 bis Datum von heute 0:00 sprich volle 24h.
Ich bin mir jetzt allerdings nicht mehr sicher, ob ich mein Programm so umschreiben kann, das es das tut, da als Inputstream ja schon die HTML Seite aufgerufen wird mit dem tagesaktuellen Log und nicht mit dem Log von gestern. Ich müßte erst:
1) Verbindung aufbauen
2) Benutzer/Passwort übertragen
3) Adresse aufrufen
4) Datumsparameter übertragen
5) Ausgabe des Servers speichern

Aber kann ich mein Programm dafür überhaupt nutzen...wahrscheinlich denke ich zu komplizeirt und es fehlen einfach nur 3 Zeilen Code und die Kiste läuft, aber seit tagen geht nichts vorwärts...spiele schon mit dem gedanken auf AutoIT umzusteiegn und den ganzen Kram zu scripten...ob das die Lehrer aber so gern sehen, wage ich zu bezweifeln *lol**lol**lol*
Cybered
 
Wenn du "manuell" im Browser arbeitest, wie sieht es genau aus.
Ich nehme an du tippst zuerst eine Adresse ein und rufst die Seite auf, wo du zuerst zur Anmeldung gebeten wirst. Fragen:
1) Wie lautet diese Adresse?
2) Wie sieht der Anmeldedialog aus: ist das ein im Browser eingebautes Standardanmeldefenster, oder werden die Eingabefelder für Benutzer und Passwort auf der Seite angezeigt?
.
EDIT :
.

Auf der Webseite des Servers wird also das "Aktuelle" Logfile angezeigt und zusätzlich noch 2 Felder für ein "vergangenes" Datum + ein "Submit" Button.
3)Kannst du den Quelltext dieser Seite hier posten?
 
Die Adresse ist "http://192.168.1.34/" (oder eine andere *buck*)
einfach im browser eintippen, dann geht ein Popup-Fenster auf mit Benutzer/Passwort.
Und dann kommt ein nettes Bild und ein paar links...ich muß dann zu "/func/setup/log/"
da erscheint dann das "aktuelle" Log...
Habe die entscheidenen Stellen mal aus der HTML rausgeholt ->
Code:
<html><head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"></head><body><p></p><form action="/func/setup/getlog" method="post" name="thelog">
Start date<input name="Startdatum" value="2008-09-11 00:00:00" type="text">
End date<input name="Enddatum" value="2008-09-12 00:00:00" type="text">
<input name="dummy" value="1221121089" type="hidden"><input name="action" value="Search" type="submit"></form>
</body></html>

Bin jetzt leider raus...danke schon mal für deine Mühe *massa*

cybered
 
Dann versuche etwa so:
Code:
public static InputStream openAuthorizedStream( URL url, String name, String passwd ) throws IOException
  {
    URLConnection verbindung = url.openConnection();
    verbindung.setDoInput( true );
    verbindung.setRequestProperty( "Authorization", userNamePasswordBase64(name,passwd) );
[B]    verbindung.setRequestProperty( "Startdatum", "2008-09-11 00:00:00" );
    verbindung.setRequestProperty( "Enddatum", "2008-09-12 00:00:00" );
    verbindung.setRequestProperty( "dummy", "1221121089" );
[/B]    verbindung.connect();
    return verbindung.getInputStream();
  }
 
Hallo,
dann müßte ich aber direkt die URL aufrufen, wo ich auf das Formular komme, sprich ->
http://192.168.1.x/func/setup/log
Muß ich denn die Submit-Funktion (sprich den Button) auch implementieren, oder läuft das automatisch ???
Werde heute Abend mal versuchen, das irgendwie hinzubiegen.
Es ist, da ja jetzt ein Lösungsansatz da ist, wohl nicht sinnvoll, weitere Versuche mit der Scriptsprache "AutoIT" zu starten...ich hoffe einfach mal, das das mit Java dann letzendlich doch noch funktioniert.
Schon mal Danke für alles
Cybered
 
Du muss die URL aufrufen, an die die Formulardaten gesendet werden. Wie du in deinem HTML-Quelltext siehst, ist es http://192.168.1.x/func/setup/getlog.

Und die Submit-Funktion ist genau das was dein Code macht: wenn man auf der Webseite auf Submit klickt, sendet der Browser die Formulardaten per POST an den Server. Dein Code ist also nichts anderes, als Emulation dieses Klicks.

Bin gespannt auf das Ergebnis :)
 
Zuletzt bearbeitet:
Bin gespannt auf das Ergebnis :)
Ich war es auch, allerdings muß ich mich und leider auch dich enttäuschen, da der Server einfach ein "The requested page was not found " zurückschickt.
Nehme ich aber die zusätzlichen setRequestProperty Anweisungen raus und gebe die normale URL http://192.168.1.x/func/setup/log/ an, macht er das was er soll...alles was kommt in einer Datei wegspeichern.
Evt. sollte ich noch irgendwo ne Wartezeit eintragen, das erst die Benutzeranmeldung abgeschlossen ist und erst dann die Parameter übertragen *noahnung*

Cybered
 
Yep. Wir haben vergessen, die Request-Methode auf POST zu setzen, denn standardmäßig benutzt HttpURLConnection GET. Also nächster Versuch:
Code:
public static InputStream openAuthorizedStream( URL url, String name, String passwd ) throws IOException
  {
    URLConnection verbindung = url.openConnection();
    verbindung.setDoInput( true );
    [B]((HttpURLConnection)verbindung).setRequestMethod("POST");[/B]
    verbindung.setRequestProperty( "Authorization", userNamePasswordBase64(name,passwd) );
    verbindung.setRequestProperty( "Startdatum", "2008-09-11 00:00:00" );
    verbindung.setRequestProperty( "Enddatum", "2008-09-12 00:00:00" );
    verbindung.setRequestProperty( "dummy", "1221121089" );
    verbindung.connect();
    return verbindung.getInputStream();
  }
 
Leider wieder nix, allerdings wirft der Server jetzt ein "Bad Request" zurück...das ich auch wunderbar abspeichern kann *buck*
Hier der Quelltext der "Antwort"
Code:
<HTML><HEAD>
<TITLE>400 Bad Request</TITLE>
</HEAD>
<BODY><H1>Bad Request</H1>Request failed.<P></BODY>
</HTML>

Nicht sehr ergiebig die Fehlermeldung. Das Programm an sich meldet auch keine Fehler, nur das eben nicht die angeforderte Seite durch den Äther wandert sondern eine Fehlermeldung.
Ich habe keine Ideen mehr *noahnung*
Cybered
 
werds versuchen, aber nicht mehr heute...danke schon mal und ich werde berichten ;-)

Cybered
 
Zurück
Oben Unten