Неверный заголовок файла cookie, а затем он запрашивает авторизацию - PullRequest
0 голосов
/ 14 июля 2011

Я пытаюсь сканировать страницу, требующую аутентификации Siteminder, поэтому я пытаюсь передать свое имя пользователя и пароль в самом коде, чтобы получить доступ к этой странице и продолжать сканировать все ссылки, которые есть на этой странице.Это мой Controller.java код.И из этого класса MyCrawler вызывается.

public class Controller {
    public static void main(String[] args) throws Exception {

            CrawlController controller = new CrawlController("/data/crawl/root");

            controller.addSeed("http://ho.somehost.com/");

            controller.start(MyCrawler.class, 10);  
            controller.setPolitenessDelay(200);
            controller.setMaximumCrawlDepth(3);
    }
}

И это мой код MyCrawler.java.В этом я передаю свои учетные данные (имя пользователя и пароль) для аутентификации администратора сайта.И просто хотел убедиться, что аутентификация должна выполняться в этом коде MyCrawler или в приведенном выше коде контроллера. ???И этот код сканера взят отсюда (http://code.google.com/p/crawler4j/)

public class MyCrawler extends WebCrawler {

    Pattern filters = Pattern.compile(".*(\\.(css|js|bmp|gif|jpe?g"
            + "|png|tiff?|mid|mp2|mp3|mp4" + "|wav|avi|mov|mpeg|ram|m4v|pdf"
            + "|rm|smil|wmv|swf|wma|zip|rar|gz))$");

    public MyCrawler() {


    }

    public boolean shouldVisit(WebURL url) {

        System.out.println("RJ:- " +url);

        DefaultHttpClient client = null;

        try
        {
            // Set url
            //URI uri = new URI(url.toString());

            client = new DefaultHttpClient();

            client.getCredentialsProvider().setCredentials(
                    new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, null),
                    new UsernamePasswordCredentials("test", "test"));

            // Set timeout
            //client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 5000);
            HttpGet request = new HttpGet(url.toString());

            HttpResponse response = client.execute(request);
            if(response.getStatusLine().getStatusCode() == 200)
            {
                InputStream responseIS = response.getEntity().getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(responseIS));
                String line = reader.readLine();
                while (line != null)
                {
                    System.out.println(line);
                    line = reader.readLine();
                }
            }
            else
            {
                System.out.println("Resource not available");
            }
        }
        catch (ClientProtocolException e)
        {
            System.out.println(e.getMessage());
        }
        catch (ConnectTimeoutException e)
        {
            System.out.println(e.getMessage());
        }
        catch (IOException e)
        {
            System.out.println(e.getMessage());
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
        finally
        {
            if ( client != null )
            {
                client.getConnectionManager().shutdown();
            }
        }


        String href = url.getURL().toLowerCase();
        if (filters.matcher(href).matches()) {
            return false;
        }
        if (href.startsWith("http://")) {
            return true;
        }
        return false;
    }

    public void visit(Page page) {
        int docid = page.getWebURL().getDocid();
        String url = page.getWebURL().getURL();         
        String text = page.getText();
        List<WebURL> links = page.getURLs();
        int parentDocid = page.getWebURL().getParentDocid();

        System.out.println("Docid: " + docid);
        System.out.println("URL: " + url);
        System.out.println("Text length: " + text.length());
        System.out.println("Number of links: " + links.size());
        System.out.println("Docid of parent page: " + parentDocid);
        System.out.println("=============");
    }   
}

Я печатаю URL, чтобы увидеть, какие URL печатаются.Таким образом, он печатает два URL-адреса, один фактический URL-адрес, требующий аутентификации, а затем некоторый URL-адрес siteminder.И когда я запускаю этот проект, я получаю сообщение об ошибке следующим образом.

RJ:- http://ho.somehost.com/net/pa/ho.xhtml
 WARN [Crawler 1] Invalid cookie header: "Set-Cookie: SMCHALLENGE=; expires=Sat, 15 Jan 2011 02:52:54 GMT; path=/; domain=.somehost.com". Unable to parse expires attribute: Sat, 15 Jan 2011 02:52:54 GMT
 WARN [Crawler 1] Invalid cookie header: "Set-Co## Heading ##okie: SMIDENTITY=nzFSq2U3g/C3C6/jkj/Ocghyh/njK; expires=Sat, 13 Jul 2013 02:52:54 GMT; path=/; domain=.somehost.com". Unable to parse expires attribute: Sat, 13 Jul 2013 02:52:54 GMT
null
 INFO [Crawler 1] Number of pages fetched per second: 0
RJ:- https://lo.somehost.com/site/no/176/sm.exhtml
 WARN [Crawler 1] Invalid cookie header: "Set-Cookie: SMCHALLENGE=; expires=Sat, 15 Jan 2011 02:52:56 GMT; path=/; domain=.somehost.com". Unable to parse expires attribute: Sat, 15 Jan 2011 02:52:56 GMT
 WARN [Crawler 1] Invalid cookie header: "Set-Cookie: SMIDENTITY=IqsIPo; expires=Sat, 13 Jul 2013 02:52:56 GMT; path=/; domain=.somehost.com". Unable to parse expires attribute: Sat, 13 Jul 2013 02:52:56 GMT

Любые предложения будут оценены по достоинству.Я ввожу свое имя пользователя и пароль, затем я получаю фактический экран.

1 Ответ

0 голосов
/ 15 июля 2011

Извлечение существенного содержания обсуждения в чате для потомков, в случае, если кто-то столкнется с той же проблемой.

Отображаемое предупреждающее сообщение о том, что HttpClient не смог проанализировать заголовок Set-Cookie, выданный SiteMinder.Анализ сетевого трафика с использованием Wireshark показал следующее:

  • Не был установлен атрибут expires для файла cookie SMSESSION, который был выпущен SiteMinder.Это не причина проблемы;Это всего лишь примечание, что необходимо просмотреть HTTP-ответ от сервера, ответственного за предупреждение.
  • Предупреждения были выданы для файлов cookie SMCHALLENGE и SMIDENTITY.Поэтому ответы, содержащие заголовки Set-Cookie для этих двух файлов cookie, необходимо изучить.
  • Проблема может заключаться в следующем:
    • сами значения cookie или
    • в форматедат в атрибуте expires файлов cookie.
  • Ошибка № 923 в HttpClient была исправлена ​​в версии 4.1.1 HttpClient и может содержать разрешение.Исправление предназначено для поддержки двух- и четырехзначных лет и может быть причиной проблемы.

Если вышеупомянутое (использование четырехзначных лет в значении cookie истекает) оказываетсяневерная основная причина, тогда необходимо указать формат даты, используемый для анализа значения cookie.Это можно сделать, указав список разрешенных / принятых форматов даты, используя HttpClient следующим образом:

HttpGet request = new HttpGet(url.toString());
request.getParams().setParameter(CookieSpecPNames.DATE_PATTERNS, Arrays.asList("EEE, d MMM yyyy HH:mm:ss z"));
HttpResponse response = client.execute(request);

вместо существующих вызовов:

HttpGet request = new HttpGet(url.toString());

HttpResponse response = client.execute(request);

Указанный шаблон EEE, d MMM yyyy HH:mm:ss z является допустимым шаблоном для дат, которые, по-видимому, анализируются неправильно (по сообщениям в консоли).Вам нужно будет добавить дополнительные шаблоны, если есть другие форматы даты, которые HttpClient неправильно обрабатывает.Подробнее об используемом формате см. Документацию класса SimpleDateFormat .

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