【发布时间】:2011-06-08 13:57:25
【问题描述】:
如何在 htmlunit 中指定一个 cookie 策略来接受所有的 cookie?
【问题讨论】:
-
@Mat Banik,我发布了一些答案,但不是很好。
-
我发现与其调整 cookie 策略,不如看看为什么 cookie 被拒绝 - 并修复。
如何在 htmlunit 中指定一个 cookie 策略来接受所有的 cookie?
【问题讨论】:
只需重新创建整个 CookieManager 类: 这是课程的来源:http://jarvana.com/jarvana/view/net/sourceforge/htmlunit/htmlunit/2.8/htmlunit-2.8-sources.jar!/com/gargoylesoftware/htmlunit/CookieManager.java?format=ok
现在查找这个方法public synchronized Set<Cookie> getCookies(final URL url)
在那里你会发现这个:
public static final String HTMLUNIT_COOKIE_POLICY = CookiePolicy.BROWSER_COMPATIBILITY; //default
final CookieSpec spec = registry_.getCookieSpec(HTMLUNIT_COOKIE_POLICY);
for (final org.apache.http.cookie.Cookie cookie : all) {
if (spec.match(cookie, cookieOrigin)) {
matches.add(cookie);
}
}
远程规格匹配声明if (spec.match(cookie, cookieOrigin))您应该接受所有cookie,无论政策如何。和/或您可以处理 ACCEPT_ALL_COOKIES 标志并通过匹配的规范(如果这是配置中指示的策略)。
【讨论】:
一些修改源代码的解决方案。
您可以简单地从 httpClient 中的 org.apache.http.client.protocol.ResponseProcessCookies 中删除 cookieSpec.validate(cookie, cookieOrigin); 行
在 htmlUnit 中,您可以创建自己的策略并在 com.gargoylesoftware.htmlunit.CookieManager 中使用它而不是
public static final String HTMLUNIT_COOKIE_POLICY = CookiePolicy.BROWSER_COMPATIBILITY;
...
final CookieSpec spec = registry_.getCookieSpec(HTMLUNIT_COOKIE_POLICY);
它应该取决于 CookieManager 的构造函数参数,但作者不这么认为)
/**
* HtmlUnit's cookie policy is to be browser-compatible. Code which requires access to
* HtmlUnit's cookie policy should use this constant, rather than making assumptions and using
* one of the HttpClient {@link CookiePolicy} constants directly.
*/
因此,如果您想实现自己的 Cookie 策略或处理 CookiePolicy.BROWSER_COMPATIBILITY 不是浏览器功能的情况,您应该修改代码。
【讨论】: