Domanda

Devo accedere a una pagina Web https e scaricare un file usando Java. Conosco in anticipo tutti gli URL:

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"));

Se provo tutti questi collegamenti in un browser web come Firefox, funzionano.

Ora quando lo faccio:

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();

Ricevo di nuovo l'HTML della pagina di accesso e non posso procedere al download del file.

Grazie!

È stato utile?

Soluzione

Sono d'accordo con Alnitak che il problema è probabilmente la memorizzazione e la restituzione dei cookie.

Un'altra buona opzione che ho usato è HttpClient di Jakarta Commons.

Vale la pena notare, a parte, che se questo è un server che controlli, dovresti essere consapevole che l'invio di nome utente e password come stringhe di query non è sicuro (anche se stai usando HTTPS). HttpClient supporta l'invio di parametri tramite POST, che dovresti prendere in considerazione.

Altri suggerimenti

Come è stato notato, è necessario mantenere il cookie di sessione tra le richieste (consultare CookieHandler ).

Ecco un'implementazione di esempio:

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);
            }
        }
    }

}

Nonostante tu possa avere qualche altro problema che impedisce alla richiesta di accesso di farti accedere, è improbabile che tu possa procedere alla pagina di download a meno che tu non memorizzi e restituisca tutti i cookie generati dalla pagina di accesso.

/ p>

Questo perché HTTP stesso è senza stato, quindi nel tuo codice attuale non c'è modo per il server remoto di dire che la seconda richiesta di download proviene dallo stesso utente che ha appena effettuato l'accesso.

Direi di dare un'occhiata a Java CURL http://sourceforge.net/projects/javacurl. L'ho usato prima per accedere a un sito Web https e scaricare roba, ha caratteristiche come lo spoofing dell'ID del browser, ecc. Che potrebbe risolvere il problema di essere reindirizzati al login.

Sebbene forniscano un plugin eclipse, l'ho usato senza e funziona benissimo.

In alternativa puoi usare wget e chiamarlo da Java.

Forse vuoi provare HttpUnit . Sebbene scritto pensando ai test dei siti Web, potrebbe essere utilizzabile per il tuo problema.

Dal loro sito Web:

" ... Scritto in Java, HttpUnit emula le parti rilevanti del comportamento del browser, tra cui l'invio di moduli, JavaScript, l'autenticazione HTTP di base, i cookie e il reindirizzamento automatico delle pagine e consente al codice di test Java di esaminare le pagine restituite come testo, un DOM XML o contenitori di moduli, tabelle e collegamenti. "

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top