Avatar billede jespersahner Nybegynder
25. januar 2006 - 23:00 Der er 11 kommentarer og
1 løsning

Login via HTTPS

Jeg bruger HTTPURLConnection til at tilgå et website. På dette site foretages login via en HTML-form på formen:

<form action="https://www.mysite.com/login.pl" method="post" NAME="myForm">
...
<b>Brugernavn:</b><br><input type="text" NAME="a1" style="width:145px" value="" class="input">
...
<b>Password:</b><br><input type="password" NAME="a2" style="width:145px" value="" class="input">
...
</form>

Form'en bruger altså HTTPS. Mit spm. er nu, hvordan jeg logger ind på siden vha. HTTPURLConnection osv.?
Avatar billede arne_v Ekspert
26. januar 2006 - 04:46 #1
package javax.negt.ssl

class HttpsURLConnection

setMethod

write data som "a1=xxxx&a2=yyyy"

men du skal selv holde sessionen (cookie eller URL rewriting)
Avatar billede arne_v Ekspert
26. januar 2006 - 04:46 #2
Jakarta Commons HttpClient er nok nemmere at bruge
Avatar billede arne_v Ekspert
26. januar 2006 - 04:47 #3
jeg har vistnok noget kode liggende
Avatar billede jespersahner Nybegynder
26. januar 2006 - 09:38 #4
->arne_v: Det vil jeg blive super-glad for.

Jeg undrer mig lidt over flg.:

Jeg kan for så vidt godt tilgå https://www.mysite.com/login.pl "direkte" (dvs. uden først at tilgå selve websitet, hvor form'en er indeholdt) med HTTPURLConnection osv., og jeg tror nok, at login foretages. Jeg kan i hvert fald se, at hvis jeg skriver forkert brugernavn eller password, får jeg nogle fejlmeddelelser retur, hvad jeg ikke gør, hvis jeg angiver korrekt brugernavn og password. Hvad jeg undrer mig over er imidlertid, at den website jeg får retur ved korrekt brugernavn og password er en anden end den jeg normalt får vist i min browser så at sige.
Avatar billede jespersahner Nybegynder
26. januar 2006 - 10:30 #5
->arne_v: Du giver mig et hint omkring at holde sessionen. Retur-svaret efter login er vist nok svarende til, at sessionen har nået time-out; altså svarende til når man foretager login i browseren og refresher efter længere tids inaktivitet, hvor man så bliver bedt om fornyet login.
Avatar billede arne_v Ekspert
26. januar 2006 - 13:57 #6
sessionen holdes jo normalt ved at man ve dlogin faar sat en cookie som man
sende med ved allle foelgende requests

ingen cookie => ikke logget ind

[udover cookies kan der ogsaa bruges URL rewriting]

det gode ved HttpClient pakken er at den ordner alt det med cookies automatisk
Avatar billede jespersahner Nybegynder
26. januar 2006 - 15:39 #7
->arne_v: Jeg prøver at kigge efter cookies ved login men får kun flg. retur:

Date=Thu, 26 Jan 2006 14:33:50 GMT
Server=Apache
Last-Modified=Thu, 17 Nov 2005 08:21:04 GMT
ETag="9832d-697-437c3d70"
Accept-Ranges=bytes
Content-Length=1687
Keep-Alive=timeout=5, max=100
Connection=Keep-Alive
Content-Type=text/html

Burde der ikke være en "Set-Cookie"?
_______________

Program:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class Login {
   
    public static void main(String[] args) throws MalformedURLException, IOException {
        URL url = new URL("https://www.mysite.dk/login.pl");
        HttpURLConnection con = (HttpURLConnection)url.openConnection();
        con.setRequestMethod("POST");
        String info = "a1=jespersahner&a2=xxxx";
        con.setDoOutput(true);
        con.getOutputStream().write(info.getBytes());
        con.connect();
        if(con.getResponseCode() == HttpURLConnection.HTTP_OK) {
            InputStream is = con.getInputStream();           
            int n=1;
            boolean done = false;
            while (!done){
                String headerKey = con.getHeaderFieldKey(n);
                String headerVal = con.getHeaderField(n);
                if (headerKey!=null || headerVal!=null) {
                    System.out.println(headerKey+"="+headerVal);       
                } else {
                    done = true;
                }
                n++;
            }
            BufferedReader br=new BufferedReader(new InputStreamReader(is));           
            String s;
            while ((s=br.readLine())!=null) {
                System.out.println(s);               
            }
            is.close();
        }
        else System.out.println("Connection refused.");
        con.disconnect();
    }   
}
Avatar billede jespersahner Nybegynder
26. januar 2006 - 18:48 #8
->arne_v: Er det noget med at Apache-serveren, jf. ovenfor, bruger "URL rewriting" i stedet for cookies? Og hvordan får jeg i så fald denne facilitet bygget ind i min kode?
Avatar billede arne_v Ekspert
27. januar 2006 - 04:36 #9
URL rewriting viser sig ved at der optraede en mystisk tilfoejelse paa alle URL'er

Det er et Perl CGI script du skal snakke med ?
Avatar billede arne_v Ekspert
27. januar 2006 - 04:37 #10
Jeg havde det her oldgamle eksempel med commons httpclient, som er testet
mod en Tomcat der bruger cookies til at identficere session med:

import java.io.IOException;

import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;

public class Login {
    private HttpClient client;
   
    public Login() {
        client = new HttpClient();
    } 
   
    public void login(String url,
                      String userField, String userValue,
                      String passField, String passValue) {
        NameValuePair[] nvp = new NameValuePair[2];
        nvp[0] = new NameValuePair(userField, userValue);
        nvp[1] = new NameValuePair(passField, passValue);
        post(url, nvp);
    }
    public String get(String url) {
        GetMethod met = new GetMethod(url);
        try {
            client.executeMethod(met);
        } catch (HttpException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return met.getResponseBodyAsString();
    }
    public String post(String url, NameValuePair[] nvp) {
        PostMethod met = new PostMethod(url);
        if(nvp != null) {
            met.setRequestBody(nvp);
        }
      try {
        client.executeMethod(met);
      } catch (HttpException e) {
            e.printStackTrace();
      } catch (IOException e) {
            e.printStackTrace();
      }
        return met.getResponseBodyAsString();
    }
  public static void main(String[] args) {
        Login lgi = new Login();
        lgi.login("http://arne:8080/useradmin/Login",
                  "username", args[0],
                  "password", args[1]);
        System.out.println(lgi.get("http://arne:8080/useradmin/UserAdmin.jsp"));
  }
}
Avatar billede jespersahner Nybegynder
27. januar 2006 - 13:31 #11
->arne_v: Mange tak for dit input og koden; jeg roder videre med HttpClient. Du har nok ret i, at den er nemmere at have med at gøre. Lidt underligt at det er så kringlet med HttpURLConnection osv.

Smid gerne et svar.
Avatar billede arne_v Ekspert
27. januar 2006 - 14:31 #12
vi skal jo op i noget der ligner en web browser emulering

og svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester