Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > 403 error


Автор: yuliada 27.2.2009, 12:48
Есть краулер, который тянет html-странички, но не все нужные странички удается стянуть, хотя в браузере они открываются. При дебаге сорцов выяснилось, что при таких случаях при коннекте возникает ошибка 403. Судя по нагугленному это происходит из-за того, что краулер пытается коннектиться по https. Используется apache HTTPClient. Т.е. вот такой код даст 403 ошибку

Код

        HttpClient httpclient = new HttpClient();
        GetMethod httpget = new GetMethod("http://www.something.com");
        try {
            httpclient.executeMethod(httpget);
            System.out.println(httpget.getStatusLine());
        } finally {
            httpget.releaseConnection();
        }


Попыталась разобраться как сделать это через https. Нагуглила следующий пример:

Код

  HttpClient httpclient = new HttpClient();
  httpclient.getHostConfiguration().setProxy("myproxyhost", 8080);
  httpclient.getState().setProxyCredentials("my-proxy-realm", " myproxyhost",
  new UsernamePasswordCredentials("my-proxy-username", "my-proxy-password"));
  GetMethod httpget = new GetMethod("https://www.verisign.com/");
  try { 
    httpclient.executeMethod(httpget);
    System.out.println(httpget.getStatusLine());
  } finally {
    httpget.releaseConnection();
  }


Не совсем понятно как его использовать, какие значения передавать в параметрах setProxy() и setProxyCredentials(), если я знаю только url сайта. Или может быть проблема вообще не в этом, и это делать надо по другому как-то, у меня в этой области мало опыта. У кого какие есть советы?

Заранее спасибо smile

Автор: LSD 27.2.2009, 13:44
Цитата(yuliada @  27.2.2009,  12:48 Найти цитируемый пост)
Попыталась разобраться как сделать это через https. Нагуглила следующий пример:

Это пример авторизации на прокси сервере, а не на сайте.

Браузер при заходе на сайт логин и пароль  запрашивает? Заходить на сайт можно с любого компьютера и любым браузером или только с компьютеров домена?

Автор: yuliada 27.2.2009, 16:38
Сайт не спрашивает ничего, заходить можно откуда угодно и чем угодно (работает на firefox, opera, ie)

Автор: yuliada 27.2.2009, 18:03
Хотя нет, сори за дезинформацию, сейчас потерла в браузере пароли и кукисы, оказалось что спрашивает пароль и логин. Просто на всех машинках, на которых я работаю туда заходили уже много раз. Еще там есть сообщение про кукисы Note: You must set your browser to accept cookies in order for login to succeed. В краулере никаких кукисов нет... Не очень владею этой темой, пытаюсь разобраться...

Автор: LSD 27.2.2009, 20:34
Как идёт запрос логина и пароля, появляется всплывающее окошко или надо в форму ввести логин и пароль?

Автор: yuliada 27.2.2009, 21:23
Форма для ввода пароля и логина. Пример такой ссылки http://www.gene-regulation.com/cgi-bin/pub/databases/transcompel/getCompel.cgi?AC=C00011, там регистрация free, логин yuliada, пароль abahaba

Автор: yuliada 27.2.2009, 21:47
Видимо https это из другой оперы. Вот это вроде бы работает, но это как-то не выглядит как общее решение, т.е. такая форма это везде так или только здесь в частности... Почему в браузере после введения пароля не возникает страницы с логином снова? Как-то используются coockies? Можно то же самое програмно на яве реализовать?

Код

private static void doWork() throws IOException {
        HttpClient client = new HttpClient();
        PostMethod method = new PostMethod("http://www.gene-regulation.com/login");
        method.addParameter(new NameValuePair("user", "yuliada"));
        method.addParameter(new NameValuePair("password", "abahaba"));
        method.addParameter(new NameValuePair("request_uri", "/cgi-bin/pub/databases/transcompel/getCompel.cgi?AC=C00011"));
        client.executeMethod(method);
        printResponce(method);
        GetMethod get = new GetMethod("http://www.gene-regulation.com/cgi-bin/pub/databases/transcompel/getCompel.cgi?AC=C00011");
        client.executeMethod(get);
        printResponce(get);

    }

    private static void printResponce(HttpMethod get) throws IOException {
        System.out.println(get.getStatusCode());
        BufferedReader br = new BufferedReader(new InputStreamReader(get.getResponseBodyAsStream()));
        String line = br.readLine();
        while (line != null) {
            System.out.println(line);
            line = br.readLine();
        }
    }

Автор: LSD 27.2.2009, 22:41
Пользователь заходит на страничку с вводом логина и пароля, пользователь вводит логин и пароль, отправляет их на сервер. После чего сервер отправляет браузеру пользователя куку (в данном случае Ticket). При последующих обращениях браузер передает эту куку серверу, а тот идентифицирует по ней пользователя.

HttpClient поддерживает работу с куками, их можно сохранять в файл, загружать при запуске и т.д. Вопрос только в том, сколько кука будет действительна (это определяется сервером) и как изначально это куку получать. Можно делать это так как ты показала, или можно брать эти куки из браузера.

Автор: yuliada 27.2.2009, 23:10
ок, спасибо большое, разобралась smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)