# html login und apache client



## The Hit-Man (15. Jul 2008)

Ich programmiere gerade dieses hier nach: Post Problem, da ich auch eine HTML Seite nach einem Login auslesen will.

Mein Code sieht so weit so aus:

```
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.*;
.....
    public void getPage() {
        HttpClient client = new HttpClient();
```

Allerdings gibt es beim Erstellen, des client schon Fehlermeldungen:

```
init:
deps-jar:
Warning: html_parser\OlgTools.java modified in the future.
Compiling 1 source file to E:\java\html_parser\build\classes
compile:
run:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
        at org.apache.commons.httpclient.HttpClient.<clinit>(HttpClient.java:66)
        at html_parser.OlgTools.getPage(OlgTools.java:41)
        at html_parser.Main.main(Main.java:19)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        ... 3 more
Java Result: 1
BUILD SUCCESSFUL (total time: 1 second)
```

Weiß jemand von Euch, woran das liegen könnte? Es sieht so aus, als würde die Apache Klasse ärger machen. Hatte mir die 3.1 Version besorgt.


----------



## maki (15. Jul 2008)

Hast du die commons-logging jar zum Classpath/Buildpath hinzugefügt?

Löst zwar dein Problem nicht, aber imho ist log4j das beste Logging Framework  (SCNR)


----------



## The Hit-Man (15. Jul 2008)

Ne, habe ich nicht. bin ja recht neu bei Java. Was ist denn das? Hilft mir das weiter?


----------



## maki (15. Jul 2008)

Die commoons-logging jar ist diejenige die fehlt, siehe Exception.
Keine Ahnung was du mit "Hatte mir die 3.1 Version besorgt." meinst, die aktuelle Version ist 1.1, kann man hier runterladen: 
http://commons.apache.org/downloads/download_logging.cgi

Welche IDE verwendest du?


----------



## The Hit-Man (15. Jul 2008)

Mit der 3.1, meinte ich dieses hier hc.apache.org/downloads.cgi
Seite dem ich dieses logging von Dir mit im Verzeichnis habe, meckert er beim Erstellen, des Programms auch nicht mehr. Ich werde mal weiter testen. Falls noch was sein sollte, melde ich mich kurz.

Danke

EDIT:
jetzt meckert er bei diesem Befehl 


```
PostMethod method = new PostMethod("www.freenet.de");
```

und zwar dieses:


```
init:
deps-jar:
Warning: html_parser\OlgTools.java modified in the future.
Compiling 1 source file to E:\java\html_parser\build\classes
compile:
run:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/codec/DecoderException
        at org.apache.commons.httpclient.HttpMethodBase.<init>(HttpMethodBase.java:220)
        at org.apache.commons.httpclient.methods.ExpectContinueMethod.<init>(ExpectContinueMethod.java:93)
        at org.apache.commons.httpclient.methods.EntityEnclosingMethod.<init>(EntityEnclosingMethod.java:119)
        at org.apache.commons.httpclient.methods.PostMethod.<init>(PostMethod.java:106)
        at html_parser.OlgTools.getPage(OlgTools.java:42)
        at html_parser.Main.main(Main.java:19)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.codec.DecoderException
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        ... 6 more
Java Result: 1
BUILD SUCCESSFUL (total time: 1 second)
```


----------



## maki (15. Jul 2008)

Du brauchst die commons codec jar  auch noch (http://commons.apache.org/codec/) und bestimmt noch einige mehr.



> Seite dem ich dieses logging von Dir mit im Verzeichnis habe,


Was heisst das? Hast du die jars nur in den cp kopiert?

Solltest schon wissen was der Classpath ist und wie man ihn setzt bevort du anfängst Programme zu schreiben.

Um welche IDE geht es denn jetzt?


----------



## The Hit-Man (15. Jul 2008)

jetzt scheint wieder ne Klasse zu fehlen, aber wo bekomme ich die denn her?


----------



## The Hit-Man (15. Jul 2008)

komisch, das hier hat gefehlt:
commons.apache.org/downloads/download_codec.cgi

warum sind denn das alles Einzelteile?


----------



## maki (15. Jul 2008)

>> warum sind denn das alles Einzelteile?

Ist aber nicht ernst gemeint, oder???


----------



## The Hit-Man (15. Jul 2008)

Doch ist es, weil habe von Java nicht so den Plan. Zu mindest funktioniert es jetzt  Aber klär mich auf.


----------



## maki (15. Jul 2008)

http://www.galileocomputing.de/openbook/javainsel7/

Da steht alles drinn 

Mal ernsthaft, du hast "nicht so den Plan von Java", willst aber komplexere Programme schreiben?
Grundlagen sind wichtig, ohne wird das nur frustrierend...


----------



## The Hit-Man (15. Jul 2008)

Jain  ein wenig natürlich schon. War eher der Python Freak. Also, was Methoden, Klassen, Überladungen sind, alles kein Thema. Muß mich nur nen bischen reindenken, dann wird das schon. Mein Projekt steht ja schon längt in Python/wxPython. Kriege es aber nicht gebacken, ne stand alone .exe daraus zu bekommen. Des weiteren, sollte es OS unabhängig sein, aus diesem Grund dann erst mal Java. Muß mich für meine zweite Ausbildung eh mit Java, C, C++ beschäftigen. Ähm, ja, das Buch kenne ich


----------



## Gast (15. Jul 2008)

hmmm, wie bekomme ich die Seite nun auf die Platte


----------



## The Hit-Man (16. Jul 2008)

ich habe dieses Beispiel ausprobiert und es funktioniert so weit ich das beurteilen kann:


```
static final String LOGON_SITE = "www.onlineglueck.de";
    static final int LOGON_PORT = 80;

    public void getPageGet() throws IOException {
        HttpClient client = new HttpClient();
        client.getHostConfiguration().setHost(LOGON_SITE, LOGON_PORT, "http");
        client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);

        GetMethod authget = new GetMethod("/olg/index.php");

        client.executeMethod(authget);
        System.out.println("Login form get: " + authget.getStatusLine().toString());
        authget.releaseConnection();
        CookieSpec cookiespec = CookiePolicy.getDefaultSpec();
        Cookie[] initcookies = cookiespec.match(
                LOGON_SITE, LOGON_PORT, "/", false, client.getState().getCookies());
        if (initcookies.length == 0) {
            System.out.println("None");
        } else {
            for (int i = 0; i < initcookies.length; i++) {
                System.out.println("- " + initcookies[i].toString());
            }
        }
        PostMethod authpost = new PostMethod("/olg/index.php");
        // Prepare login parameters
        NameValuePair action = new NameValuePair("action", "login");
        NameValuePair url = new NameValuePair("url", "/index.php");
        NameValuePair userid = new NameValuePair("nickname", "mein_username");
        NameValuePair password = new NameValuePair("password", "mein_password");
        authpost.setRequestBody(
                new NameValuePair[]{action, url, userid, password});

        client.executeMethod(authpost);
        System.out.println("Login form post: " + authpost.getStatusLine().toString());
        // release any connection resources used by the method
        authpost.releaseConnection();
        // See if we got any cookies
        // The only way of telling whether logon succeeded is 
        // by finding a session cookie
        Cookie[] logoncookies = cookiespec.match(
                LOGON_SITE, LOGON_PORT, "/", false, client.getState().getCookies());
        System.out.println("Logon cookies:");
        if (logoncookies.length == 0) {
            System.out.println("None");
        } else {
            for (int i = 0; i < logoncookies.length; i++) {
                System.out.println("- " + logoncookies[i].toString());
            }
        }
        // Usually a successful form-based login results in a redicrect to 
        // another url
        int statuscode = authpost.getStatusCode();
        if ((statuscode == HttpStatus.SC_MOVED_TEMPORARILY) ||
                (statuscode == HttpStatus.SC_MOVED_PERMANENTLY) ||
                (statuscode == HttpStatus.SC_SEE_OTHER) ||
                (statuscode == HttpStatus.SC_TEMPORARY_REDIRECT)) {
            Header header = authpost.getResponseHeader("location");
            if (header != null) {
                String newuri = header.getValue();
                if ((newuri == null) || (newuri.equals(""))) {
                    newuri = "/";
                }
                System.out.println("Redirect target: " + newuri);
                GetMethod redirect = new GetMethod(newuri);

                client.executeMethod(redirect);
                //hier Seite auslesen
                
                System.out.println("Redirect: " + redirect.getStatusLine().toString());
                // release any connection resources used by the method
                redirect.releaseConnection();
            } else {
                System.out.println("Invalid redirect");
                System.exit(1);
            }
        }
    }
```

Ich bekomme auch coockies zurück. Doch wie kann ich die Seite ( welche Methode ), auslesen und zum Beispiel auf Platte speichern??? Müste ich nicht irgendwie nen RESULT bekommen?


----------

