htmlunit中的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 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标志并通过匹配的规范(如果这是配置中指示的策略)。

一些源代码修改的解决方案。

  1. 您只需删除cookieSpec.validate(cookie, cookieOrigin); 来自httpClient中的org.apache.http.client.protocol.ResponseProcessCookies的一行

  2. 在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不是浏览器function的情况,则应修改代码。