# JavaScript Methode mit Java aufrufen



## letdoch (26. Okt 2009)

Hi,
ich hab ein Problem:

Ich habe eine Internetseite, auf die ich mich einloggen möchte. Diese Seite hat 2 Textfelder und einen Button. In die Textfelder kommen Username und Password und der Button ruft folgende Methode auf:"javascript:document.agentLoginForm.submit()".

Mein Javaprogramm soll Username und Passwort einarbeiten und anschließend die Methode aufrufen um mir anschließend den Inhalt der dahinter liegenden Seite anzuzeigen.

Die Logindaten habe ich natürlich, und ich könnte das auch weiter im Browser machen, aber ich hätte für meine Arbeit lieber nen eigenes JavaProgramm.

Wie kann ich also den Login bewerkstelligen?


----------



## Kaffeebohn (27. Okt 2009)

Vielleicht hast du ja die Möglichkeit, den tatsächlichen Link, der zum Login aufgerufen wird, aus dem javascript herauszuextrahieren, dann könntest du den direkt mit Username und Passwort aufrufen?


----------



## letdoch (27. Okt 2009)

das könnte vielleicht gehen, nur ich gestehe, dass ich auf dem Gebiet wirklich frisch bin und habe daher noch keine Ahnung, wie ich dort am Besten heran gehe. 

Wäre auch auch "Rhino" eine Möglichkeit, voran zukommen?


----------



## Kaffeebohn (27. Okt 2009)

ich kenne "rhino" zwar nicht, aber so wie es aussieht setzt man rhino ein, um mit java javascript zu erzeugen. ich glaube nicht, dass du damit eine fremde html-(javascript)-seite "befüllen" kannst, kann es dir aber nicht 100%ig sagen.

Ich nehme nicht an, dass du die Login-Seite "nachprogrammieren" willst, oder? Es geht dir nur darum, dass du in den Login-Bereich kommst?


----------



## Marco13 (27. Okt 2009)

Zur Abgrenzung erstmal: Du willst nicht _irgendeine_ JavaScript-Methode ausführen (das könnte man mit der ScriptEngine von Java 6 machen), und auch nicht _irgendwelche_ Login-Daten an eine Seite schicken (das könnte man glaub' ich über die Klasse "URL" mit "manuellen" POST-Befehlen machen) sondern genau DIE Funktion auf DER Seite aufrufen?! Wenn das mit einem Applet passieren sollte, das auch in die Seite eingebettet ist, würde man als erstes Websuch-Ergebnis schon sowas wie Java - Javascript interaction finden, aber eine _extene_ Java-Anwendung müßte sich ja erstmal den JavaScript-Quellcode runterladen...?! ???:L 
EDIT: Vermutlich zumindest - ob man das auch irgendwie mit einem POST oder so machen könnte, müßte man sich (bzw. ich mir) erst genauer ansehen...


----------



## letdoch (27. Okt 2009)

genauo schaut es aus, ich will an den nekter hinter der wand...

der weg wird mit nur von 2 textfeldern für username und password und einem javascript versperrt.


----------



## letdoch (27. Okt 2009)

Marco13 hat gesagt.:


> Zur Abgrenzung erstmal: Du willst nicht _irgendeine_ JavaScript-Methode ausführen (das könnte man mit der ScriptEngine von Java 6 machen), und auch nicht _irgendwelche_ Login-Daten an eine Seite schicken (das könnte man glaub' ich über die Klasse "URL" mit "manuellen" POST-Befehlen machen) sondern genau DIE Funktion auf DER Seite aufrufen?! Wenn das mit einem Applet passieren sollte, das auch in die Seite eingebettet ist, würde man als erstes Websuch-Ergebnis schon sowas wie Java - Javascript interaction finden, aber eine _extene_ Java-Anwendung müßte sich ja erstmal den JavaScript-Quellcode runterladen...?! ???:L
> EDIT: Vermutlich zumindest - ob man das auch irgendwie mit einem POST oder so machen könnte, müßte man sich (bzw. ich mir) erst genauer ansehen...



Im Prinzip will ich die Serverseitige Methode aufrufen. Ich will das mein Javaprogramm username und passwort übermittelt und dann über den Methodenaufruf oder was auch immer den Login bewältigt


----------



## Kaffeebohn (27. Okt 2009)

Ich verstehe noch nicht ganz, wie du dir das am Ende tatsächlich vorstellst.

Möchtest du, dass ein Java-Programm dir diese zwei Felder ausfüllt, sobald du die Seite aufrufst, und dann automatisch diese Funktion ausführt? Oder soll dein Java-Programm ohne dass du den Browser öffnest diese Seite aufrufen und deren Inhalt einlesen?
Oder möchtest du ein Java-Programm, welches beim Ausführen einen Browser öffnet und dich direkt einloggt?


----------



## letdoch (27. Okt 2009)

Kaffeebohn hat gesagt.:


> Ich verstehe noch nicht ganz, wie du dir das am Ende tatsächlich vorstellst.
> 
> Möchtest du, dass ein Java-Programm dir diese zwei Felder ausfüllt, sobald du die Seite aufrufst, und dann automatisch diese Funktion ausführt? Oder soll dein Java-Programm ohne dass du den Browser öffnest diese Seite aufrufen und deren Inhalt einlesen?
> Oder möchtest du ein Java-Programm, welches beim Ausführen einen Browser öffnet und dich direkt einloggt?



Ich möchte, dass mein Programm ohne die Verwendung des Browsers auf der Seite einlogt, mir die Seite ausliest so dass ich die dann mit dem Javaprogg weiter verarbeiten kann. Im Endeffekt also das Zweitere bei deiner Aufzählung.


----------



## Kaffeebohn (27. Okt 2009)

Okay dann wäre es wohl am einfachsten, tatsächlich dieses Formular nachzubilden (also im Quellcode rumschnüffeln, welche Attribute und Werte übermittelt werden und auf welchem wege, Post oder Get das FOrmular übertragen wird), daraus eine URL zu formen und diese dann in java einzulesen.


----------



## letdoch (27. Okt 2009)

Kaffeebohn hat gesagt.:


> Okay dann wäre es wohl am einfachsten, tatsächlich dieses Formular nachzubilden (also im Quellcode rumschnüffeln, welche Attribute und Werte übermittelt werden und auf welchem wege, Post oder Get das FOrmular übertragen wird), daraus eine URL zu formen und diese dann in java einzulesen.



Ja Quellcode schnüffel ist gut, nur wie soll ich rausfinden, was die ScriptMethode im Endeffekt ausführt?


----------



## Marco13 (27. Okt 2009)

DIe Methode javascript:document.agentLoginForm.submit() mal genauer ansehen?! Im Zweifelsfall kann es natürlich sein, dass die etwas macht, was man nicht einfach so "per Hand" machen kann, aber da gibt's sicher eine Lösung...


----------



## letdoch (27. Okt 2009)

Marco13 hat gesagt.:


> DIe Methode javascript:document.agentLoginForm.submit() mal genauer ansehen?! Im Zweifelsfall kann es natürlich sein, dass die etwas macht, was man nicht einfach so "per Hand" machen kann, aber da gibt's sicher eine Lösung...



vielleicht stehe ich ja auch auf dem Schlauch, aber das genau ist doch der Knackpunkt, wie soll ich das genauer ansehen, es steht doch nichts im Quelltext dazu außer eben der Methodenaufruf...auch auf der Seite dahinter steht ja da nix zu, die URL, verändert sich bei den ganzen aufrufen, zumindest vordergründig, null.


----------



## Marco13 (27. Okt 2009)

Irgendwo im HTML der Seite müßte entweder die Funktion in einem <script> block stehen, oder auf eine *.js*-Datei verwiesen werden, in der die Funktion steht...


----------



## Kaffeebohn (27. Okt 2009)

vielleicht kannst du ja mal das formular posten.

es muss ja gar nicht sein, dass die funktion selbst implementiert wurde, sondern es kann ja einfach die normale .submit() funktion sein, die jedes formular automatisch mitbringt und die genau das gleiche macht, wie wenn man auf den button "submit" klickt.


----------



## letdoch (27. Okt 2009)

Kaffeebohn hat gesagt.:


> vielleicht kannst du ja mal das formular posten.
> 
> es muss ja gar nicht sein, dass die funktion selbst implementiert wurde, sondern es kann ja einfach die normale .submit() funktion sein, die jedes formular automatisch mitbringt und die genau das gleiche macht, wie wenn man auf den button "submit" klickt.



ich werde mal den quelltext der Seite offen legen...brauch dazu nur etwas zeit, um eventuell sensivle daten zu schützen.


----------



## letdoch (27. Okt 2009)

Hier der Seitenquelltext der betreffenden Seite. Ich habe nur einige Parameter gelöscht, die auf die Herkunft evtl. schließen lassen. Sonst ist er 1zu1 kopiert.


```
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<!-- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> -->
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="expires" content="0">
<title>&nbsp;Login</title>
<meta name="author" content="">
<meta name="copyright" content="">
<meta name="date" content="">
<meta name="description" content="">
<meta name="keywords" content="">
<meta name="publisher" content="">
<meta name="robots" content="ALL">
<link rel="stylesheet" type="text/css" href="css/xyz.agent.css" media="screen" />

<link rel="stylesheet" type="text/css" href="js/ext/resources/css/ext-all.css" />
<link rel="stylesheet" type="text/css" href="js/ext/examples.css" />
<link rel="stylesheet" type="text/css" href="js/ext/resources/css/xtheme-gray.css" />
<link rel="stylesheet" type="text/css" href="js/ext/resources/css/xtheme-gray.css" />

<script type="text/javascript" src="js/jquery/jquery-1.2.6.pack.js"></script>
<script type="text/javascript" src="js/jquery/widgets/animatedcollapse.js"></script>

<script type="text/javascript" src="js/sj_agent.js"></script>
<script type="text/javascript" src="js/sj_agent_ajax.js"></script>

<script type="text/javascript" src="js/ext/adapter/ext/ext-base.js"></script>

<script type="text/javascript" src="js/ext/ext-all.js"></script>


<script type="text/javascript" src="js/ext/examples.js"></script>

<script type="text/javascript" src="js/application.js"></script>
<script type="text/javascript" src="js/ResourceManager.js"></script>

<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
<script type="text/javascript">
			Ext.onReady(function(){
				xyz.sendNotification('{"success":"empty"}');
			});
		</script>
</head>

<body onload="updateTakenCharacters();">
<div id="pageSpacer">&nbsp;</div>
<div id="page">
<div id="pageContent">
<div id="pageTitle">Login</div>
<div id="pageHeadline">Herzlich willkommen</div>
Um das Interface benutzen zu können, müssen Sie sich mit den Ihnen zur Verfügung gestellten Benutzerdaten anmelden.<br />
<hr />
<div id="ajaxResponse"></div>
 <!-- LoginForm begin -->
<div class="tiny">
<form id="agentLoginForm" name="agentLoginForm"
	action="?controller=login.action" method="post"
	enctype="multipart/form-data"><input type="hidden"
	name="agentLoginFormSubmitted" value="1" />
<ul class="tiny">

	<li class="first header"><label for="agentLogin">Benutzer</label><input
		name="submit" type="image" src="img/spacer.gif" style="border:0px" /></li>
	<li><input type="text" id="agentLogin" name="agentLogin" size="20"
		value="" /></li>
	<li class="header"><label class="required" for="agentPassword">Passwort</label></li>
	<li class="last"><input type="password" id="agentPassword"
		name="agentPassword" size="20" /></li>
</ul>
</form>
</div>

<ul class="formButtons">
	<li><a href="javascript:document.agentLoginForm.submit()"
		title="Anmelden">Anmelden</a></li>

</ul>

<!-- agentLoginForm end -->

<!-- pageMenu end --> </div>
<div id="pageRight">
<div id="pageLogo"><a href="?controller=home" title=""><img
	src="" alt="" width="136px"
	height="136px" /></a></div>
</div>
<div id="pageFooter"><a href=""
	title="&copy;" target="_blank">&</a></div>
</div>
</body>
</html>
```


----------



## Kaffeebohn (27. Okt 2009)

```
<form id="agentLoginForm" name="agentLoginForm"
	action="?controller=login.action" method="post"
	enctype="multipart/form-data"><input type="hidden"
	name="agentLoginFormSubmitted" value="1" />
<ul class="tiny">

	<li class="first header"><label for="agentLogin">Benutzer</label><input
		name="submit" type="image" src="img/spacer.gif" style="border:0px" /></li>
	<li><input type="text" id="agentLogin" name="agentLogin" size="20"
		value="" /></li>
	<li class="header"><label class="required" for="agentPassword">Passwort</label></li>
	<li class="last"><input type="password" id="agentPassword"
		name="agentPassword" size="20" /></li>
</ul>
</form>
```

Das ist ja dein Formular. Und wenn du auf den Link klickst, wird nichts anderes getan, als dieses aufzurufen. Hier also via POST.

Dabei kommt dann etwa folgender Link raus:

Dateiname.xyz?controller=login.action&agentLoginFormSubmitted=1&agentLogin=DEINNAME&password=DEINPASSWORT

Dateiname.xyz das ist die komplette Url zu der jetzigen Datei. Ich weiß noch nicht genau, was es mit


<input
		name="submit" type="image" src="img/spacer.gif" style="border:0px" />

// EDIT: Habe nachgeschaut, der input type="image" macht gar nichts relevantes.

auf sich hat..


----------



## Marco13 (27. Okt 2009)

Da stehen jede Menge .js-Dateien am Anfang, sind aber egal, weil am Ende nur [c]action="?controller=login.action" method="post"[/c] ausgeführt wird.

EDIT: OK, Kaffeebohn ist der geeignete Ansprechpartner dafür


----------



## Kaffeebohn (27. Okt 2009)

Ach ja noch was. Das mit der URL kannst du erst mal wieder vergessen, da ja via POST und nicht GET übermittelt wird.

Schau mal hier:

Sending a POST Request Using a URL (Java Developers Almanac Example)

ob dir das hilft.


----------



## letdoch (27. Okt 2009)

Kaffeebohn hat gesagt.:


> Ach ja noch was. Das mit der URL kannst du erst mal wieder vergessen, da ja via POST und nicht GET übermittelt wird.
> 
> Schau mal hier:
> 
> ...



Dieses Beispiel, habe ich hier im Forum auch schon mal gesehen und versucht umzusetzen, ohne Erfolg

Ich habe die Nutzerdaten angegeben und als URL dann entsprechend "http://bla/?controller=login". Ich kriege aber als Ergebnis nur wieder den Quellcode der bereits geposteten Seite.

Möglicherweise liegt das aber auch daran, dass vor dem eigentlich Login auf der Seite noch eine HTAccess abfrage da ist, die ich bereits erfolgreich überwunden haben

Quelltext:

```
public void htaccess (String u, String pw, URL url){
        final String USERNAME = u;
        final String PASSWORT = pw;
        Authenticator.setDefault(new Authenticator(){
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(USERNAME,PASSWORT.toCharArray());
                }
            }
        );
        try{
            BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
            FileWriter fr = new FileWriter("D:/file.htm");
            String line = null;
            while((line = br.readLine())!= null){
                fr.write(line);
            }
            fr.close();
            br.close();
        }
        catch(Exception e){
            System.out.println();
        }
    }
```

Ich gehe davon aus, dass wenn ich den BufferedReader wieder schließe, dass auch der Tunnel durch den HTAccess wieder zu ist, von daher habe ich versucht, beide Loginabfragen irgendwie zu vereinen, weiß aber nicht ob das so fuktioniert
Quellcode:

```
public void Login (String u1, String u2, String pw1, String pw2, URL url1, URL url2){
        final String USERNAME = u1;
        final String PASSWORT = pw1;
        Authenticator.setDefault(new Authenticator(){
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(USERNAME,PASSWORT.toCharArray());
                }
            }
        );
        try{
            BufferedReader br = new BufferedReader(new InputStreamReader(url1.openStream()));
            String post = URLEncoder.encode("username", "UTF-8") + "=" + URLEncoder.encode(u2, "UTF-8");
            post += "&" + URLEncoder.encode("password", "UTF-8") + "=" + URLEncoder.encode(pw2, "UTF-8");
            URLConnection urlConnection = url2.openConnection();
            urlConnection.setDoOutput(true);
            OutputStreamWriter osw = new OutputStreamWriter(urlConnection.getOutputStream());
            osw.write(post);
            osw.flush();
            osw.close();
            BufferedReader br2 = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
            FileWriter fr = new FileWriter("D:/lol.htm");
            while(br2.ready()){
                fr.write(br2.readLine());
            }
            fr.close();
            br2.close();
            br.close();
        }
        catch(Exception e){
            System.out.println(e);
        }
    }
```


----------



## Kaffeebohn (27. Okt 2009)

Dann probier es einfach aus und wenn es nicht klappt, dann melde dich.

//EDIT

bedenke, dass du alle 4 variablen mit übergeben musst:

controller=login.action
agentLoginFormSubmitted=1
agentLogin=DEINNAME
password=DEINPASSWORT


----------



## letdoch (27. Okt 2009)

Kaffeebohn hat gesagt.:


> Dann probier es einfach aus und wenn es nicht klappt, dann melde dich.
> 
> //EDIT
> 
> ...



Ich habe beide Methoden, die ich oben geschrieben habe getestet, jedoch kam immer der selbe Seitenquelltext zurück. Wenn du mir erklären könntest, wie ich die Variablen mit überge, oder mir eine Quelle zeigst, wo ich mich vielleicht darüber belesen kann wäre ich dir sehr dankbar. Ich habe in verschiedenen Lehrbüchern nachgeschlagen, doch ich vermute diese Anwendung geht eben schon zu weit für Einsteigerbücher.


----------



## byte (27. Okt 2009)

letdoch hat gesagt.:


> Ich möchte, dass mein Programm ohne die Verwendung des Browsers auf der Seite einlogt, mir die Seite ausliest so dass ich die dann mit dem Javaprogg weiter verarbeiten kann. Im Endeffekt also das Zweitere bei deiner Aufzählung.



Guck Dir mal HTMLUnit an.


----------



## letdoch (27. Okt 2009)

letdoch hat gesagt.:


> Ich habe beide Methoden, die ich oben geschrieben habe getestet, jedoch kam immer der selbe Seitenquelltext zurück. Wenn du mir erklären könntest, wie ich die Variablen mit überge, oder mir eine Quelle zeigst, wo ich mich vielleicht darüber belesen kann wäre ich dir sehr dankbar. Ich habe in verschiedenen Lehrbüchern nachgeschlagen, doch ich vermute diese Anwendung geht eben schon zu weit für Einsteigerbücher.



Der Quelltext sieht nu also wie folgt aus aber wie gesagt, das Endergebnis ist das selbe, mit dem Unterschied, dass mir, wenn ich die URL so komplett in den Broser eingebe, die Nachricht kommt, dass ich Username und Password eingeben soll:

```
public void Login (String u1, String u2, String pw1, String pw2, URL url1, URL url2){
        final String USERNAME = u1;
        final String PASSWORT = pw1;
        Authenticator.setDefault(new Authenticator(){
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(USERNAME,PASSWORT.toCharArray());
                }
            }
        );
        try{
            BufferedReader br = new BufferedReader(new InputStreamReader(url1.openStream()));
            String post = URLEncoder.encode("controller", "UTF-8") + "=" + URLEncoder.encode("login.action", "UTF-8");
            post += "&" + URLEncoder.encode("agentLogin", "UTF-8") + "=" + URLEncoder.encode(u2, "UTF-8");
            post += "&" + URLEncoder.encode("agentPassword", "UTF-8") + "=" + URLEncoder.encode(pw2, "UTF-8");
            post += "&" + URLEncoder.encode("agentLoginFormSubmitted", "UTF-8") + "=" + URLEncoder.encode("1", "UTF-8");
            URLConnection urlConnection = url2.openConnection();
            urlConnection.setDoOutput(true);
            OutputStreamWriter osw = new OutputStreamWriter(urlConnection.getOutputStream());
            osw.write(post);
            osw.flush();
            osw.close();
            BufferedReader br2 = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
            FileWriter fr = new FileWriter("D:/lol.htm");
            while(br2.ready()){
                fr.write(br2.readLine());
            }
            fr.close();
            br2.close();
            br.close();
        }
        catch(Exception e){
            System.out.println(e);
        }
    }
```

HTMLUnit habe ich mir auch schon überlegt, nur sieht der Weg, den wir bisher beschritten haben recht vielversprechend aus. Nur meine Inkompentenz steht wohl im Wege. Vielleicht kann jemand anders noch helfen?

p.s.: Ich habe die Positionen der Variablen immer mal anders aneinander gekettet, ohne Erfolg.


----------



## Kaffeebohn (27. Okt 2009)

```
post += "&" + URLEncoder.encode("password", "UTF-8") + "=" + URLEncoder.encode(pw2, "UTF-8");
```

hier fügst du ja bereits die zwei werte für username und passwort hinzu. also müsste das etwa so aussehen


```
post += "&" + URLEncoder.encode("controller", "UTF-8") + "=" + URLEncoder.encode("login.action", "UTF-8");

post += "&" + URLEncoder.encode("agentLoginFormSubmitted", "UTF-8") + "=" + URLEncoder.encode("1", "UTF-8");

post += "&" + URLEncoder.encode("agentLogin", "UTF-8") + "=" + URLEncoder.encode(u2, "UTF-8");

post += "&" + URLEncoder.encode("password", "UTF-8") + "=" + URLEncoder.encode(pw2, "UTF-8");
```


----------



## Kaffeebohn (27. Okt 2009)

lass dir mal den kompletten post ausgeben und poste ihn hier bitte.

//EDIT: Beachte nach möglichkeit auch die Reihenfolge, in denen du die Werte hinzufügst!


----------



## letdoch (27. Okt 2009)

Kaffeebohn hat gesagt.:


> lass dir mal den kompletten post ausgeben und poste ihn hier bitte.
> 
> //EDIT: Beachte nach möglichkeit auch die Reihenfolge, in denen du die Werte hinzufügst!



hier der post:
controller=login.action&agentLoginFormSubmitted=1&agentLogin=lala&password=lulu

ich frage mich, wenn es die variable agentLogin gibt, wieso heißt dann password password und nicht agendPassword...wie dem auch sei, ich habs mit beidem probiert von daher ist es erstmal Wurst.

p.s.: davor steht natürlich der link, allerdings weiß ich nicht genau, ob sich das Freagzeichen nach den Standartlink sich selbst einfügt...aber wie gesagt ich habe es mit Java und mit dem Browser relativ erfolgslos versucht.


----------



## Kaffeebohn (27. Okt 2009)

Setze mal folgendes:


```
urlConnection.setRequestMethod("POST");
```

//EDIT: Und schau mal hier

Using POST to send forms to web server with HttpURLConnection


----------



## letdoch (27. Okt 2009)

Kaffeebohn hat gesagt.:


> Setze mal folgendes:
> 
> 
> ```
> ...



Die Methode existiert nicht. Es gibt aber die Metohde xyz.setRequestProperty(Key, Value);


----------



## Kaffeebohn (27. Okt 2009)

mach mal aus der Zeile:


```
URLConnection urlConnection = url2.openConnection();
```

diese:


```
HttpURLConnection urlConnection = (HttpURLConnection) url2.openConnection();
```

dann sollte die methode existieren!


----------



## letdoch (27. Okt 2009)

letdoch hat gesagt.:


> Die Methode existiert nicht. Es gibt aber die Metohde xyz.setRequestProperty(Key, Value);



ich erzähle Mist, die gibt es schon, nur muss ich ein Objekt von HttpURLConnection erstellen

bringt aber keinen Effekt.


----------



## Kaffeebohn (27. Okt 2009)

Hast du dir das Beispiel mal angeschaut in dem Link den ich dir geschickt habe?


----------



## Kaffeebohn (27. Okt 2009)

Auslesen des Inhalts einer durch Login geschützten Website mit Java  Stefan Macke

Hier wäre mal noch ein weiterer Ansatz zu finden. (Gerade gepostet worden in diesem Forum, ein ähnliches Problem)


----------



## letdoch (27. Okt 2009)

Ich habe das ganze sogar nachprogrammiert, was du mir gelinkt hattest (das mit dem xyz.setRequestMethod).

Das andere klingt interessant, aber dazu müsste doch die Seite über Cookies abgewickelt werden oder?

Desweiteren kommt ich immer mehr zu dem Eindruck, dass die Tatsache, dass ich zuvor schon ein Login tunnel ein Problem sein könnte. Wenn man Sich folgenden Quelltext nochmal ansieht:


```
public void Login (String u1, String u2, String pw1, String pw2, URL url1, URL url2){
        final String USERNAME = u1;
        final String PASSWORT = pw1;
        Authenticator.setDefault(new Authenticator(){
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(USERNAME,PASSWORT.toCharArray());
                }
            }
        );
        try{
            BufferedReader br = new BufferedReader(new InputStreamReader(url1.openStream()));
            String post = URLEncoder.encode("controller", "UTF-8") + "=" + URLEncoder.encode("login.action", "UTF-8");
            post += "&" + URLEncoder.encode("agentLoginFormSubmitted", "UTF-8") + "=" + URLEncoder.encode("1", "UTF-8");
            post += "&" + URLEncoder.encode("agentLogin", "UTF-8") + "=" + URLEncoder.encode(u2, "UTF-8");
            post += "&" + URLEncoder.encode("password", "UTF-8") + "=" + URLEncoder.encode(pw2, "UTF-8");
            s=post;
            HttpURLConnection urlConn;
            urlConn=(HttpURLConnection)url2.openConnection();
            urlConn.setRequestMethod("POST");
            urlConn.setDoInput(true);
            urlConn.setDoOutput(true);
            urlConn.setUseCaches (false);
            urlConn.setAllowUserInteraction(true);
            urlConn.setFollowRedirects(true);
            urlConn.setInstanceFollowRedirects(true);
            urlConn.setRequestProperty ("Content-Type", "text/html; charset=iso-8859-1");
            //URLConnection urlConnection = url2.openConnection();
            //urlConnection.setDoOutput(true);
            //urlConnection.setRequestMethod("POST");
            OutputStreamWriter osw = new OutputStreamWriter(urlConn.getOutputStream());
            osw.write(post);
            osw.flush();
            osw.close();
            BufferedReader br2 = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
            FileWriter fr = new FileWriter("D:/lol.htm");
            while(br2.ready()){
                fr.write(br2.readLine());
            }
            fr.close();
            br2.close();
            br.close();
        }
        catch(Exception e){
            System.out.println(e);
        }
```

zudem nochmal die Frage: Heißt es password oder nicht eher agentPassword...heißt es agentLogin oder einfach nur login?


----------



## Kaffeebohn (27. Okt 2009)

Im HTML-Formular stehen die folgenden Einträge:


```
<input type="text" id="agentLogin" name="agentLogin" size="20" value="" /></li>
<input type="password" id="agentPassword" name="agentPassword" size="20" />
```

Also die variablen werden so benannt, wie swie bei "name" drinstehen du hast recht, es muss agentLogin und agentPassword sein!

Vielleicht probierst du bei Gelegenheit mal, ob du dich auch einloggen kannst, wenn du cookies im Browser deaktiviert hast, das würde Aufschluss darüber geben, ob das ein Problem sein könnte.

Werde mir das morgen noch mal mit den zwei URLs anschauen, durchaus denkbar dass der Fehler da liegt.


----------



## letdoch (27. Okt 2009)

Kaffeebohn hat gesagt.:


> Im HTML-Formular stehen die folgenden Einträge:
> 
> 
> ```
> ...



Dann bis morgen


----------



## tuxedo (28. Okt 2009)

Ich denke hier werden die Cookies des Rätsels lösung sein ...

- Alex


----------



## letdoch (28. Okt 2009)

Ja das dachte ich mir auch und haber deshalb folgenden Quelltext geschrieben:


```
try{
            HttpClient hc = new HttpClient();
            Credentials defaultcred = new UsernamePasswordCredentials("yo","ne");
            hc.getState().setCredentials(AuthScope.ANY, defaultcred);
            PostMethod pm = new PostMethod("http://url/?controller=login");
            pm.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
            pm.getParams().setContentCharset("iso-8859-1");
            //pm.addParameter("controller", "login");
            pm.addParameter("agentLoginFormSubmitted", "1");
            pm.addParameter("agentLogin", "rofl");
            pm.addParameter("agentPassword", "lol");
            hc.executeMethod(pm);
            return pm.getResponseBodyAsString();

        }
        catch(Exception e){
            e.printStackTrace();
            return "error";
        }
```

Das Ding ist nur, dass ich dennoch nur die Loginseite zurück kriege...sobald ich nen Schreibfehler mache beim "controller=login", krieg ich gleich nichts zurück


----------



## HoaX (28. Okt 2009)

HTMLUnit nehmen und glücklich sein ... ?!


----------



## letdoch (28. Okt 2009)

HoaX hat gesagt.:


> HTMLUnit nehmen und glücklich sein ... ?!



ja aber ich bzw. wir sind ja auf dem richtigen Weg, irgendwass stimmt noch nicht...

Ich werde mir HTMLUnit mal ansehen, jedoch muss es doch auch mit dem HTTPClient gehen...

edit:
Ich habe es mal grob überflogen und muss sagen, dass HTMLUnit echt nicht schlecht klingt, erfüllt aber nur indirekt den Nutzen, den ich erzielen will. Ich will das ganze auf mehr oder weniger herkömmliche Art lösen, ich sehe HTMLUnit als letztes Mittel, was ich aber, so denke ich, noch nicht einsetzen muss oder?

Leichter und irgendwie, ist nicht immer besser. Wie sieht es zum Beispiel mit der Geschwindigkeit aus, wenn ich eine Seite lade? Das ist in diesem Fall sehr wichtig.

Mit wäre es derzeit wiegesagt nich lieber, es per POST-Methode zu lösen, wenn es denn geht.


----------

