Как войти в систему и загрузить файл с веб-страницы https с Java? - PullRequest
3 голосов
/ 07 января 2009

Мне нужно войти на веб-страницу https и загрузить файл с помощью Java. Я знаю все 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"));

Если я попробую все эти ссылки в веб-браузере, например Firefox, они будут работать.

Теперь, когда я делаю:

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

Я просто возвращаю страницу входа в HTML снова и не могу перейти к загрузке файла.

Спасибо!

Ответы [ 5 ]

5 голосов
/ 07 января 2009

Я согласен с Alnitak, что проблема заключается в хранении и возврате файлов cookie.

Другой хороший вариант, который я использовал, - HttpClient от Jakarta Commons.

Стоит отметить, что если вы управляете этим сервером, вы должны знать, что отправка имени пользователя и пароля в виде строк запроса небезопасна (даже если вы используете HTTPS). HttpClient поддерживает отправку параметров с использованием POST, что следует учитывать.

4 голосов
/ 07 января 2009

Как уже было отмечено, вы должны поддерживать сеансовый cookie между запросами (см. CookieHandler ).

Вот пример реализации:

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

}
3 голосов
/ 07 января 2009

Несмотря на то, что у вас может быть какая-то другая проблема, препятствующая входу в систему запроса входа в систему, маловероятно, что вы сможете перейти на страницу загрузки, если не сохраните и не вернете файлы cookie, сгенерированные страницей входа.

Это связано с тем, что сам HTTP не имеет состояния, поэтому в вашем текущем коде удаленный сервер не может сказать, что второй запрос на загрузку поступил от того же пользователя, который только что вошел в систему.

2 голосов
/ 07 января 2009

Я бы сказал, посмотрите на Java CURL http://sourceforge.net/projects/javacurl. Я уже использовал его для входа на веб-сайт https и загрузки материалов, в нем есть такие функции, как подмена идентификатора браузера и т. Д., Которые могут решить вашу проблему перенаправления обратно на страницу входа.

Хотя они предоставляют плагин Eclipse для него, я использовал его без, и он работает нормально.

В качестве альтернативы вы можете использовать wget и вызывать его из Java.

1 голос
/ 07 января 2009

Возможно, вы хотите попробовать HttpUnit . Хотя написано с учетом тестирования веб-сайтов, оно может пригодиться для вашей проблемы.

С их сайта:

"... Написанный на Java, HttpUnit эмулирует соответствующие части поведения браузера, включая отправку форм, JavaScript, базовую проверку подлинности http, файлы cookie и автоматическое перенаправление страниц, и позволяет тестовому коду Java проверять возвращаемые страницы как текст, XML DOM или контейнеры форм, таблиц и ссылок. "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...