[java] + domino server + login

AleX

Erfahrenes Mitglied
hi,
ich hab folgendes problem und hoffe, dass sich jemand hierbei auskennt:
Auf meinem Domino-Server gibt es ein LoginFormular einfach an eine beliebige url ?OpenLogin hinhängen und dann wird die dazugehörige maske aufgerufen.

Nun hab ich aber das Problem, dass ich von einer Java-Applikation eine XML-Datei vom Server auslesen muss, für welche man aber eingeloggt sein muss. Nun hab ich versucht, in java einen cookie zu erstellen und über diesen die urlconnection aufzubauen. Allerdings geht dies einfach garnicht, oder er gibt mir die source von dem Loginformular.

Generell wäre ich auch für andere Möglichkeiten offen, ich brauche lediglich einen erfolgreichen login. SessionId oder so was brauch ich auch nicht, Login kann gleich verfallen muss mir nur die eine xml vom server holen.

Habs auch schon versucht, der LoginMaske zwei parameter mitzugeben (user&pass), was auch funktioniert und dann einfach per javascript das formular abschicke und dann per bufferedreader die daten auslese, wobei dies aber dann wieder daran gescheitert ist, dass java anscheinend, nach login nicht auf die ziel page (die xml) weitergeht und ich nur wieder die source vom loginformular bekomme... :(

Alles über DIIOP kein prob, leider soll gerade aber dies umgangen werden, wegen firewalls, proxy usw...

Kann mir jemand weiterhelfen? Ist echt wichtig...
 

Christian Fein

Erfahrenes Mitglied
oi oi AleX.

ich weiss jetzt leider nicht
wie dieser passwort schutz
von domino Server funktioniert.

[oracle-modus]
aber versuch doch mal nach der
ULRConnection auf das Login eine
seperate URLConnection auf die XML
Datei aufzubauen.
[/oracle-modus]
 

AleX

Erfahrenes Mitglied
danke für die antwort, aber das hilft leider auch nicht :|

ich hab schon in der notes designer hilfe nachgesehen und auch auf den notes eigenen foren, aber keine wirklich hilfreichen infos zu diesem problem gefunden...
 

AleX

Erfahrenes Mitglied
hi HolyFly,
also ich hoffe hoffe, dass du dir nochmal kurz zeit für den thread nimmst.. :)
http://dev.kanngard.net/Permalinks/ID_20021030224455.html <- dort hab ich jetzt ne echt gute docu gefunden.
Allerdings schaffe ich es trotzdem nicht, mich einzuloggen...
Es würde mir auch genügen, einfach mal an die session-id zu gelangen.

Wäre echt cool, wenn du dir den artikel mal ansehen könntest und mir vielleicht dann mal kurz erklären würdest in groben schritten, wie der code aufgebaut sein müsste.

Im Anhang des Artikels sind auch noch paar fertige methoden, auch ganz hilfreich.
 

Christian Fein

Erfahrenes Mitglied
Wenn ich das richtig verstanden habe bekommst du diesen Header in der Response vom Server.
Auf die Header daten kannst du ohne probleme zugreifen.

Code:
HTTP/1.1 302 Found
Server: Lotus-Domino/5.0.1
Date: Mon, 28 Oct 2002 22:06:19 GMT
Location: http://server.com/
Connection: close
Content-Base: http://server.com/?Login
Content-Type: text/html
Set-Cookie: DomAuthSessId=41D3D0110BA61CB171B345F147C089BD; path=/

Ich instanziere ein neues URL Object und übergebe dem Konstruktor die url als String.
öffne dann die verbindung und setze ein paar Triggers (setDoOutput usw)
uc.setRequestProperty("Content-Type","application/x-www-form-urlencoded");

Danach bilde ich ein ByteArrayOutputStream()
Welchen ich dem Konstruktor der PrintWriter übergebe. Der PrintWriter ist dann sozusagen meine Schnittstelle zum Senden von Daten. Über diesen Writer werden die Daten in als Postdaten unter dem namen para hinterlegt.
und dann dem output stream übergeben zum senden der daten.
Code:
URL url = new URL(myurl);
URLConnection uc = url.openConnection();
uc.setDoOutput(true);
uc.setDoInput(true);
uc.setUseCaches(false);    uc.setRequestProperty("Content-type","application/x-www-form-urlencoded");
        
ByteArrayOutputStream dos = new ByteArrayOutputStream(512);
PrintWriter out = new PrintWriter(dos,true);      
String para =  "data="+data;
out.print(para);
out.flush();
String lengthString = String.valueOf(dos.size());        
dos.writeTo(uc.getOutputStream());
Das ist nichts anderes als alle daten 'data' mit dem namen 'data' zu myurl senden.


Der Server sendet darauf hin die Antwort die wird durch auslesen des InputStreams der URLConnection bekommen

Code:
BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream()));
String line;
String linefeed = "\n";
while((line = in.readLine()) != null) {
      Writer.write(line);  	
}

Hier wird die Antwort ausgelesen. Das ist aber nur der Text part. Sprich jener der unterhalb des Headers kommt. Um die Header auszulesen
kannst du direkt ddrauf zugreifen:
uc.getHeaderField("Set-Cookie");

oder drüber iterieren:
Code:
ArrayList headerValues = new ArrayList(10);
Iterator  itt = 
uc.getHeaderFields().keySet().iterator()
while(itt.hasNext()) {
  String headername = itt.next().toString();
  headerValues.add(uc.getHeaderField(headername));
}

Das heisst du müsstest das Field Set-Cookie auslesen und beim nächsten Request den header die zeile:
Cookie : [Wert aus Set-Cookie der antwort]
mitzusenden.
Wo genau die methode bei der URLConnection klasse zum Header setzen ist habe ich noch nicht gefunden. Aber notfalls kannst du auch ne Socket Verbindung auf port 80 von hand senden und direkt in den Stream schreiben.
 

AleX

Erfahrenes Mitglied
hi, also schon mal ein fettes danke!!!

hab jetzt folgenden code:
Code:
public class source {
    public static void read() {

        String myurl = "http://www.server.de/names.nsf?Login";
        String data = hm.getLoginRequest("server.de", "xxx", "yyy");
        try {
            URL url = new URL(myurl);
            URLConnection uc = url.openConnection();
            uc.setDoOutput(true);
            uc.setDoInput(true);
            uc.setUseCaches(false);
            uc.setRequestProperty("Content-type", "application/x-www-form-urlencoded");

            ByteArrayOutputStream dos = new ByteArrayOutputStream(512);
            PrintWriter out = new PrintWriter(dos, true);
            System.out.println(data);
            String para = "data=" + data;
            out.print(para);
            out.flush();

            String lengthString = String.valueOf(dos.size());
            dos.writeTo(uc.getOutputStream());
            BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream()));
            String line;
            String linefeed = "\n";

            while ((line = in.readLine()) != null) {
                //System.out.println(line);
                //Writer.write(line);
            }

            System.out.println("id = " + uc.getHeaderField("Set-Cookie"));

            ArrayList headerValues = new ArrayList(10);
            Iterator itt = uc.getHeaderFields().keySet().iterator();
            while (itt.hasNext()) {
                try {
                    String headername = itt.next().toString();
                    headerValues.add(uc.getHeaderField(headername));
                    System.out.println(uc.getHeaderField(headername));
                } catch (Exception ex) {
                    System.out.println("error");
                }
            }

        } catch (Exception e) {
            System.out.println(e);
        }
    }
}





public static  String getLoginRequest(
            String host,
            String username,
            String password) {

        String formData = getFormData(
                new String[] {"UserName", "Password"},
                new String[] {username, password});

        return "POST /?Login HTTP/1.1\n" +
               "Host: " + host + "\n" +
               "Content-Type: application/x-www-form-urlencoded\n" +
               "Content-Length: " + formData.length() + "\n" +
               "\n" +
               formData + "\n";
    }

und als output:
Code:
POST /?Login HTTP/1.1
Host: server.de
Content-Type: application/x-www-form-urlencoded
Content-Length: 27

UserName=xxx&Password=yyy

id = null
Tue, 18 Mar 2003 15:45:00 GMT
text/html; charset=ISO-8859-1
de
11701
error
Tue, 01 Jan 1980 06:00:00 GMT
Lotus-Domino
no-cache
Tue, 18 Mar 2003 15:44:58 GMT

Wenn ich das System.out.println(line); nicht auskommentier kommt der gesamte sourcecode zurück und bei falscher kombination von pass und username der source des login formulars ansonsten der zeilpage nach erfolgreichem login :)

Nur die SessionID bleibt immer null, weis echt nicht warum...

Aso, wegen Writer.write(line); <- non static methode can not be raferenced from a static context (dürft eigentlich nicht sein, auch wenn ich die methode als public deklariere, ohne static)

trotzdem schon mal danke für alles, war jetzt schon ne super hilfe, wenn das jetzt auch ncoh klappen würde, wärs echt geil :)
 
Zuletzt bearbeitet:

Christian Fein

Erfahrenes Mitglied
Ich bin leider grad auf der Arbeit aber ich versuch mir mal da heute abend noch ein paar gedanken über das Problem machen.

Aber du schreibst ein Tutorial wenn du den Connect hast ok? ;-)
 

AleX

Erfahrenes Mitglied
ok, kann ich machen. :)

ps: bin auch in der arbeit, nur dass das gerade meine arbeit ist :rolleyes:

- aber ich lerns ja gerade erst (AZUBI erstes jahr):)

dass ichs nicht vergesse, er haut ne nullpointerexception raus...
bei "itt.next()" findet er wohl was nicht...
 
Zuletzt bearbeitet:

AleX

Erfahrenes Mitglied
ah (grad erfahren), muss das bis morgen abend hinbekommmen haben.
Könntest du mir als großer Programmierer nochmal ein wenig unter die arme greifen? ;)
please

Dann kommt auch ein tut, versprochen. ;)
 
Zuletzt bearbeitet:

Christian Fein

Erfahrenes Mitglied
Alex ich bin auf der Arbeit :p

ich kann ab und zu zwischendurch etwas machen, aber keine zeit dafür einplanen.

Zumal ich dir fast nicht mehr weiterhelfen kann, da ich kein Domino Server hier habe und das ganze nicht nachvollziehen kann