今天下午用 HtmlUnit做新浪的登陆,由于新浪的多域名原因,出现了下面警告
Cookie rejected: "[version: 0][name: U_TRS1][value: 000000e4.603e4743.527caa18.4f2f5b0d][domain: .sina.com.cn][path: /][expiry: Mon Nov 06 17:08:40 CST 2023]". Illegal domain attribute "sina.com.cn". Domain of origin: "account.weibo.com"
大概意思就是Cookie被拒绝,域名的问题。
百度了几篇,答案代码通通没效果,然后去Google了一下,发现挺多老外也遇到了这个问题。
其中 Stack Overflow 里面有一个最佳答案,说的是重写 CookieManager 里面的 getCookies(final URL url) 方法,然后webClient.setCookieManager(myManager);进去。
我照着做了下,发现没用。
后来下载了源码,自己进行DEBUG,发现getCookies(final URL url)方法根本没有执行,反而执行了getCookies(); 方法
/**
* Returns the currently configured cookies, in an unmodifiable set.
* @return the currently configured cookies, in an unmodifiable set
*/
public synchronized Set<Cookie> getCookies() {
final Set<Cookie> copy = new HashSet<Cookie>(cookies_);
return Collections.unmodifiableSet(copy);
}
于是我一层一层找下去,最后发现org.apache.http.impl.cookie.BasicDomainHandler.java 里,有一个public void validate(final Cookie cookie, final CookieOrigin origin)被调用,然后这个方法验证失败后抛出了异常,打印log :Cookie rejected。。。
for (Cookie cookie : cookies) {
try {
cookieSpec.validate(cookie, cookieOrigin);
cookieStore.addCookie(cookie);
if (this.log.isDebugEnabled()) {
this.log.debug("Cookie accepted: \""
+ cookie + "\". ");
}
} catch (MalformedCookieException ex) {
if (this.log.isWarnEnabled()) {
this.log.warn("Cookie rejected: \""
+ cookie + "\". " + ex.getMessage());
}
}
}
我重写了这个方法,搞定。不过要注意的是,重写这个方法不能完全注释掉它的验证,需要针对性的重写,否则可能会引发其他验证问题。
最后,我发现我犯了一个错误,虽然Cookie最后是弄进去了,但是这次错误的主要原因是 我误以为 weibo.cn 跟 weibo.com 的Cookie可以共享的。。但是实际上它不像sina.com ..weibo.com..等其他域名一样,一个Cookie可以通吃。
最后介绍个学习网站:
http://gz.itcast.cn/
分享到:
相关推荐
htmlunit 模拟cookie 存取 cookie值登录 如: wsyyuser.xywy.com Cookie c = new Cookie("wsyyuser.xywy.com", "PHPSESSID", Common.getValue("session_id") );
赠送jar包:htmlunit-core-js-2.27.jar; 赠送原API文档:htmlunit-core-js-2.27-javadoc.jar; 赠送源代码:htmlunit-core-js-2.27-sources.jar; 赠送Maven依赖信息文件:htmlunit-core-js-2.27.pom; 包含翻译后...
HttpClient4.1.2 和 HtmlUnit2.9 是在Java编程中处理网络请求和网页解析的两个重要库。这篇博客文章可能详细介绍了如何利用这两个库来实现文件的下载功能。 HttpClient 是Apache基金会的一个项目,提供了丰富的HTTP...
cd nutch-htmlunit/runtime/local bin/crawl urls crawl false 1 //urls参数为爬虫入库url文件目录; crawl为爬虫输出目录; false本应为solr索引url参数,此处设置为false不做solr索引处理; 1为爬虫执行回数 ...
HTMLUnit使用HttpClient来处理网络通信,包括GET和POST请求,设置请求头,处理重定向等。版本4.5.2提供了一套完整的HTTP协议实现,支持HTTPS和各种HTTP特性。 4. **xml-apis-1.4.01.jar**:这是一个XML API的集合,...
### httpclient使用教程 #### HttpClient概述与重要性 在当今互联网时代,HTTP协议无疑是网络通信中最常用且至关重要的协议之一。随着技术的发展,越来越多的Java应用程序需要直接通过HTTP协议访问网络资源。尽管...
在"java httpclient 模拟登录"这个场景下,我们通常会用到HttpClient来模拟用户登录网站的过程,获取登录后的session信息,以便后续能够访问登录后才能看到的页面内容。以下将详细介绍如何使用Java HttpClient进行...
这些依赖通常会自动解决,但如果使用的是较旧的HTMLUnit版本,可能需要手动添加缺失的jar包。 总的来说,HTMLUnit是一个强大且灵活的工具,可以让你在Java环境中无需实际浏览器即可执行Web交互。它简化了网页爬虫的...
总的来说,"htmlunit基本jar包"是一个独立的、完整的解决方案,为开发者提供了在Java环境中进行Web页面自动化测试和交互的能力。通过理解每个JAR文件的作用,我们可以更有效地利用这个工具,提高开发和测试的效率。
HTMLUnit是一个Java库,模拟一个无头Web浏览器,主要用于自动化测试和网页抓取。它能够解析HTML、执行JavaScript,并返回用户可以操作的DOM元素。在Java应用中使用HTMLUnit,通常需要依赖一系列的JAR(Java Archive...
这些jar包的组合使得HTMLUnit能够正确解析和执行网页,包括处理HTML、CSS、JavaScript以及进行网络通信,从而为开发者提供了一种强大的无头浏览器解决方案。在使用HTMLUnit时,确保这些依赖项完整并正确配置,可以...
安装 HTMLUNIT 的步骤: 在此处下载 HTMLUNIT: ://sourceforge.net/projects/htmlunit/files/htmlunit/2.15/htmlunit-2.15-bin.zip/download 解压 .zip 文件到下载文件夹将 lib 文件夹添加到 IDE 项目 EX: eclipse...
### HttpClient 学习整理 #### 一、简介 `HttpClient`是Apache Jakarta Commons下的一个子项目,用于提供高效、最新及功能丰富的HTTP客户端编程工具包。对于那些希望通过HTTP协议访问网络资源的Java应用程序而言,...
HTMLUnit是一个Java库,它提供了一个无头浏览器模拟器,用于自动化Web页面的导航和交互。这个库在测试、数据抓取以及不需图形用户界面的场景中非常有用。"htmlUnit所需jar包"的标题表明这是一个包含HTMLUnit运行所需...
HTMLUnit是Java编程语言中的一款无头Web浏览器库,它模拟了浏览器的行为,但不涉及图形用户界面。这个工具主要用于自动化测试和网络爬虫,因为它能够解析HTML、执行JavaScript,并与网页上的各种元素进行交互。在...
HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient。 下载地址: http://hc.apache.org/downloads.cgi 1.2特性 1. 基于标准、纯净的java语言。...
HTMLUnit是一个强大的Java库,主要用于自动化网页浏览和测试。它模拟了一个无头浏览器,能够执行JavaScript,处理Ajax请求,以及渲染HTML页面。在最新的版本2.29中,这个库继续提供高效、灵活的网页抓取和自动化工具...
HTMLUnit是一个强大的Java库,它模拟了一个无头Web浏览器,主要用于自动化测试和网页抓取。在版本2.23的zip文件中,我们主要关注HTMLUnit的核心功能和它如何帮助开发者处理HTML内容。 HTMLUnit的核心是基于Jakarta ...
通过HTMLUnit,开发者可以编写程序来模拟用户在浏览器上的操作,如点击链接、填写表单、执行JavaScript等,而无需真正打开一个浏览器实例。 使用HTMLUnit获取执行JavaScript后的HTML文档,首先需要理解HTMLUnit的...