# Login via apache httpclient



## kn1g (9. Sep 2010)

Hi hab versucht mich auf einer Seite einzuloggen. Funktioniert alles. Bekomm aber nen 303 (für alle die nich wissen was ich meine HTTP Error 303 See other Explained) als Status.
Versuche mich gerade Testweise auf meinem Joomla TestBackend einzuloggen.
Glaub ich mach grundsätzlich was falsch...

Gekürzter und kommentierter Code.




```
_login(GetSomethingFromUrl("value=\"1\"","http://nmkfs.de/joomla_test/administrator/index.php"));      
 
//GetSomethingFromUrl liest eine seite aus und extrahiert aus der Loginform den jeweiligen Token... Die funktion Funktioniert einwandfrei...
        
 
 
public static void _login(String token){
 
        
 
 
    // Erzeuge einen HTTPClient
    HttpClient client = new HttpClient();
 
    // Post Methode erzeugen 
    PostMethod method = new PostMethod("http://nmkfs.de/joomla_test/administrator/index.php");
 
    method.setRequestHeader("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)");
 
    method.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
  // Request Parameter werden hinzugefügt
    method.addParameter("username", "xxxxx");       //inputfeld <input type="text" size="15" class="inputbox" id="modlgn_username" name="username">
    method.addParameter("passwd", "xxxxx");     //inputfeld <input type="text" size="15" class="inputbox" id="modlgn_username" name="username">
    method.addParameter("option", "com_login");     //inputfeld <input type="text" size="15" class="inputbox" id="modlgn_username" name="username">
    method.addParameter("task", "login");           //inputfeld <input type="text" size="15" class="inputbox" id="modlgn_username" name="username">
    method.addParameter(token, "1");                //inputfeld <input type="text" size="15" class="inputbox" id="modlgn_username" name="username">
 
   
 
    int statusCode = 0;
    StringBuffer inputString = null;
 
        try {
            // Ausführen des Requests , Seite wird angefordert
            // zurückgegeben wird ein statusCode der dir sagt ob der Request / Response erfolgreich war
            statusCode = client.executeMethod(method);
            System.out.println(statusCode);
       
 ... // ERROR wird gecatched
 
   // Falls Request/Response erfolgreich lese den Response aus und schreibe diesen Zeile für Zeile in einen Stringbuffer
    if (statusCode != -1) {
        try {
            String line;
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream()));
            inputString = new StringBuffer();
                while ((line = bufferedReader.readLine()) != null) {
                    inputString.append(line + "\n");
                }
        }
       ... // ERROR wird gecatched und Verbindung geschlossen
}
                       
                        
                
}
```


Der Code gibt keine Fehlermeldung. Ich bekomme nur den HTML ERROR CODE... Ich glaube ich habe was grundsätzliches nicht verstanden oder falsch gemacht.

Wär cool wenn wer was wüsste...


----------



## Firestorm87 (9. Sep 2010)

Tolle Kommentare 
Denn leider hat jeder deiner Parameter angeblich das gleiche Inputfield,...

Außerdem kann man ohne den kompletten HTML-Code vom Formular nur sehr wenig darüber aussagen, was da an falschem Input drin steckt.
Vom vorgehen her sollte es ansonsten funktionieren... Denke einfach, dass du entweder an die falsche Adresse den POST-Befehl sendest, oder einem in der Antwort steckenden Redirect ignorierst....


----------



## Sekundentakt (10. Sep 2010)

Wenn Du einen 303 zurückkriegst, bedeutet das, die Webseite möchte Dich auf eine andere Seite weiterleiten.

Folgendes steht dazu in der HttpClient Doku:


> Entity enclosing requests cannot be redirected without user intervention according to RFC 2616.


Eine PostMethod ist eine EntitiyEnclosingMethod und folgt einem Redirect nicht automatisch.

Das heißt, Du müsstest in etwa so vorgehen ( Pseudocode ):


```
int statuscode = httpClient.executeMethod(method);

			int times = 0;
			Header locationHeader;
			while((statuscode == HttpStatus.SC_MOVED_TEMPORARILY || statuscode == HttpStatus.SC_MOVED_PERMANENTLY) && times < 3)
			{
				times++;//Erhöhe Times bei jedem Request um 1, um Redirect Cycles zu vermeiden 
                                           //-> das wäre dann nämlich eine Endlosschleife. 
                                          //Wir wollen maximal 3x einem Redirect folgen, bevor wir es aufgeben.
				locationHeader = method.getResponseHeader("location");
				method = new PostMethod(locationHeader.getValue());
				setParams(/* in diese Methode lagerst Du das setzen der benötigten Parameter aus - die müssen nämlich jedesmal aufs Neue gesetzt werden*/);
				statuscode = httpClient.executeMethod(method);
			}
			
			if(statuscode == HttpStatus.SC_OK)
			{
				//Du bist auf der Seite, auf die man Dich weiterleiten wollte, angekommen. . . 
			}
```
Den Code müsstest Du natürlich noch in einen Try-Catch-Block packen und im Finally - Block method.releaseConnection() aufrufen.

Bei Deinem bisherigen Konstrukt wurde Dir kein ResponseBody, sondern ein Header zugeschickt. Deswegen ist der InputStream von .getResponseBodyAsStream() auch leer.


----------



## kn1g (24. Sep 2010)

@Firestorm87 - sry ich hab einfach nur als beispiel da alles gepastet. sind natürlich unterschiedliche

@Sekundentakt - Hey vielen Dank für die Antwort! Hat mir wirklich weitergeholfen. Ich habs etwas anders gemacht aber ohne deinen Post wär ich nie auf die Spur gekommen! Vielen Dank!
:applaus:


----------



## kn1g (26. Sep 2010)

brauch ich eigentlich diese Codezeile?

 method.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);

was genau macht die? Hab in der doc nur soviel verstanden, dass hier Cookie Specifikations gesetzt werden... Aber ich als client will doch gar kein Cookie setzen??? Ich glaube ich habe das ganze grundsätzlich falsch verstanden...

Wär cool wenn es mir noch wer erklären könnte.

Merci schonmal!

(btw die Grafische Sicherheitsüberprüfung ist eine Kastrophe... ich schaffs nicht unter 5 falschen eingaben das zu lesen... oder ich klick 10 mal Grafik neu laden bis ichs lesen kann... anscheind bin ich dumm und blind -.- )


----------

