Wie kann ich anmelden und eine Datei von einer HTTPS-Web-Seite von Java herunterladen?

StackOverflow https://stackoverflow.com/questions/421251

  •  05-07-2019
  •  | 
  •  

Frage

Ich habe in eine https Webseite einzuloggen und eine Datei mit Java herunterladen. Ich kenne alle URLs vorher:

baseURL = // a https URL;
urlMap = new HashMap<String, URL>();
urlMap.put("login", new URL(baseURL, "exec.asp?login=username&pass=XPTO"));
urlMap.put("logout", new URL(baseURL, "exec.asp?exec.asp?page=999"));
urlMap.put("file", new URL(baseURL, "exec.asp?file=111"));

Wenn ich all diese Links in einem Web-Browser versuchen, wie firefox, sie arbeiten.

Wenn ich jetzt tun:

urlConnection = urlMap.get("login").openConnection();
urlConnection.connect();
BufferedReader in = new BufferedReader(
    new InputStreamReader(urlConnection.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
    System.out.println(inputLine);
in.close();

Bekomme ich nur wieder die Login-Seite HTML zurück, und ich kann nicht fortgesetzt werden Download-Datei.

Danke!

War es hilfreich?

Lösung

ich mit Alnitak darüber einig, dass das Problem wahrscheinlich speichert und wiederkehr Cookies.

Eine weitere gute Option, die ich verwendet habe, ist Httpclient von Jakarta Commons.

Es ist bemerkenswert, als beiseite, dass, wenn dies ein Server Sie steuern, sollten Sie sich bewusst sein, dass der Benutzername und das Passwort als querystrings Senden nicht sicher ist (auch wenn Sie HTTPS verwenden). Httpclient unterstützt Parameter mit POST zu senden, die Sie berücksichtigen sollten.

Andere Tipps

Wie bereits erwähnt, müssen Sie das Session-Cookie zwischen Anforderungen halten (siehe CookieHandler ).

Hier ist eine Beispielimplementierung:

class MyCookieHandler extends CookieHandler {

    private Map<String, List<String>> cookies = new HashMap<String, List<String>>();

    @Override
    public Map<String, List<String>> get(URI uri,
            Map<String, List<String>> requestHeaders) throws IOException {
        String host = uri.getHost();
        Map<String, List<String>> ret = new HashMap<String, List<String>>();
        synchronized (cookies) {
            List<String> store = cookies.get(host);
            if (store != null) {
                store = Collections.unmodifiableList(store);
                ret.put("Cookie", store);
            }
        }

        return Collections.unmodifiableMap(ret);
    }

    @Override
    public void put(URI uri, Map<String, List<String>> responseHeaders)
            throws IOException {
        List<String> newCookies = responseHeaders.get("Set-Cookie");
        if (newCookies != null) {
            String host = uri.getHost();
            synchronized (cookies) {
                List<String> store = cookies.get(host);
                if (store == null) {
                    store = new ArrayList<String>();
                    cookies.put(host, store);
                }
                store.addAll(newCookies);
            }
        }
    }

}

Ungeachtet dessen, dass Sie ein anderes Problem haben, dass die Login-Anfrage wird verhindert, dass Sie immer angemeldet, dann ist es unwahrscheinlich, dass Sie in der Lage sein werden, um die Download-Seite zu gehen, wenn Sie keine Cookies speichern und zurückzugeben, die die Login-Seite erzeugt.

Das ist, weil HTTP selbst staatenlos ist, so in Ihrem aktuellen Code gibt es keine Möglichkeit für den Remote-Server ist zu sagen, dass die zweite Download-Anfrage vom selben Nutzer, die in nur protokolliert.

Ich würde sagen, einen Blick auf Java ROTATION haben http://sourceforge.net/projects/javacurl. Ich habe es verwendet, bevor sie in eine https-Website und Download-Material einzuloggen, hat es Funktionen wie Spoofing den Browser-ID usw. Welches ist Ihr Problem lösen könnte die Rückseite umgeleitet zu werden um sie einzuloggen.

Obwohl sie eine Eclipse-Plugin für sie bieten habe ich es ohne verwendet und es funktioniert gut.

Alternativ können Sie wget verwenden und es aus Java aufrufen.

Vielleicht möchten Sie Httpunit versuchen. Obwohl mit dem Testen von Websites im Sinne geschrieben wird, kann es für Ihr Problem verwendbar sein.

Von ihrer Website:

“... in Java geschrieben, emuliert Httpunit die relevanten Teile des Browserverhalten, einschließlich der Formularübermittlung, JavaScript, grundlegende HTTP-Authentifizierung, Cookies und automatische Seitenumleitung und ermöglicht Java Testcode zurück Seiten zu untersuchen entweder als Text, ein XML DOM oder Container von Formularen, Tabellen und Links. "

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top