Java 无效的Cookie头,然后它询问';授权书

Java 无效的Cookie头,然后它询问';授权书,java,httpclient,web-crawler,Java,Httpclient,Web Crawler,我试图抓取一个需要Siteminder身份验证的页面,因此我试图在代码中传递我的用户名和密码来访问该页面,并继续抓取该页面中的所有链接。这是我的Controller.javacode。从这个MyCrawler类被调用 public class Controller { public static void main(String[] args) throws Exception { CrawlController controller = new CrawlCo

我试图抓取一个需要Siteminder身份验证的页面,因此我试图在代码中传递我的用户名和密码来访问该页面,并继续抓取该页面中的所有链接。这是我的
Controller.java
code。从这个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代码。在此,我将传递我的凭据(用户名和密码)以进行siteminder身份验证。只是想确保身份验证应该在这个MyCrawler代码或上面的控制器代码中完成。。???这个爬虫代码取自这里
(http://code.google.com/p/crawler4j/)


任何建议都将不胜感激。如果我将该登录url复制粘贴到浏览器中,然后它会询问用户名和密码,如果我键入用户名和密码,那么我将获得实际屏幕。

为后代提取聊天讨论的重要内容,以防有人遇到同样的问题

显示的警告消息表明HttpClient无法解析SiteMinder发出的
Set Cookie
头。使用Wireshark对网络流量进行的分析揭示了以下几点:

  • 没有为SiteMinder发布的cookie SMSESSION设置expires属性。这不是问题的原因;需要注意的是,需要查看负责警告的服务器的HTTP响应
  • 针对cookies
    SMCHALLENGE
    SMIDENTITY
    发出了警告。因此,需要检查包含这两个Cookie的
    Set Cookie
    头的响应
  • 问题可能在于:
    • cookie值本身,或
    • Cookie的expires属性中日期的格式
  • HttpClient的版本在HttpClient的版本4.1.1中已修复,可能包含解决方案。修复程序用于支持2位数和4位数年份,可能是问题的原因
如果上述情况(cookie expires值中使用4位年份)证明是不正确的根本原因,则必须指定用于解析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 yyy HH:mm:ss z
对于解析错误的日期(通过控制台中的消息)是有效的模式。如果HttpClient无法正确处理其他日期格式,则需要添加其他模式。有关所用格式的详细信息,请参阅课堂文档。

没有答案,因为我没有任何方法重现此问题。您似乎正在使用Apache的HttpComponents项目中的HttpClient。我建议先阅读教程,特别是关于认证cookie的部分;您当前的问题与不正确的cookie处理有关。显然,您还没有意识到或不知道SiteMinder身份验证是如何工作的,因此我建议您阅读所有文档,以了解它是如何工作的。为什么这很重要?“因为你两周来一直在问这个问题。”维尼特·雷诺兹,谢谢你的回答。。HttpClient的相同代码在我的不同项目中运行良好,因为我发现了问题所在。如果我在这个项目中使用了相同的代码,那么我将返回错误。所以这就是为什么我很困惑这次我做错了什么……那么,这两个项目有什么不同呢?也许这会给你一个答案。如果你已经知道,请用这些信息更新这个问题。@Vinet Reynolds,这次只有我试图访问的url不同。用户名和密码也是一样的。首先,我想看看为什么cookie的过期日期是过去的
Sat,2011年1月15日02:52:54 GMT
。您应该从发布的cookie开始,比较每种情况下服务器的行为。当然,您不能排除服务器的问题。如果您需要更多帮助,我建议您进行一次聊天。
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);