Программно войти на сайт из Java-приложения - PullRequest
1 голос
/ 18 сентября 2009

Я использую пакет Apache HttpCommons 3.1 для входа на сайт.

Веб-сайт представляет собой страницу jsp с формой, использующей j_security_check вместе с j_username и j_password.

Из браузера я бы сделал следующее:

  1. Перейти на страницу Login.jsp
  2. Введите имя пользователя и пароль
  3. Нажмите на кнопку входа

Имея действительные имя пользователя и пароль, я попаду в ограниченные ресурсы. Звучит достаточно просто, проблема в том, что я пытался сделать это с помощью простого Java-приложения, используя пакет Apache HttpCommons 3.1 (HttpClient, GetMethod, PostMethod и т. Д.), И я получаю 302-ресурс, перемещенный с сервера.

Вот мой исходный код:

String strURL = "http://host:port/app/login/LoginForm.jsp";
        HttpState initialState = new HttpState();
        HttpClient httpclient = new HttpClient();
        httpclient.getHttpConnectionManager().getParams().setConnectionTimeout(30000);
        httpclient.setState(initialState);
        httpclient.getParams().setCookiePolicy(CookiePolicy.RFC_2109);
        GetMethod httpget = new GetMethod(strURL);
        int result = httpclient.executeMethod(httpget);
        System.out.println("Response status code: " + result);
        Cookie[] cookies = httpclient.getState().getCookies();
        String res1 = httpget.getResponseBodyAsString();
        httpget.releaseConnection();

        PostMethod postMethod = new PostMethod("http://host:port/app/j_security_check");
        NameValuePair[] postData = new NameValuePair[2];
        postData[0] = new NameValuePair("j_username", "username");
        postData[1] = new NameValuePair("j_password", "password");
        postMethod.addParameters(postData);
        postMethod.addRequestHeader("Referer",strURL);

        for (int i = 0; i < cookies.length; i++)
        {
            initialState.addCookie(cookies[i]);
        }
        httpclient.setState(initialState);
        try
        {
            httpclient.executeMethod(postMethod);
        }
        catch (HttpException httpe)
        {
            System.err.print("HttpException");
            System.err.println(httpe.getMessage());
            httpe.printStackTrace();
        }
        catch (IOException ioe)
        {
            System.err.print("IOException");
            System.err.println(ioe.getMessage());
            ioe.printStackTrace();
        }
        String res2 = postMethod.getResponseBodyAsString();
        postMethod.releaseConnection();
        System.out.println(res2);
    }
    catch (IOException ex)
    {
        //print out ...
    }

Я пробовал пример того же типа на том же сервере, используя код PHP (CURL), и меня перенаправили на страницу, которую я ожидал после успешного входа в систему.

Есть идеи, почему то же самое не работает в Java?

Спасибо, - МК

Ответы [ 3 ]

3 голосов
/ 18 сентября 2009

Вам необходимо вызвать postMethod.setFollowRedirects (true). 302 - это перенаправление на страницу входа в систему.

0 голосов
/ 18 сентября 2009

В соответствии с документацией на сайте (http://hc.apache.org/httpclient-3.x/redirects.html), HttpClient не обрабатывает определенные перенаправления по умолчанию, поскольку авторы считают, что они лучше всего обрабатываются пользователем. Если вы просматриваете веб-сайты для определенного содержимого В прошлом я использовал библиотеку WebHarvest с большим успехом. Вы можете найти ее в sourceforge: http://web -harvest.sourceforge.net /

0 голосов
/ 18 сентября 2009

Возможно, что HttpCommons не поддерживает 302, попробуйте HttpUnit .

...