2011-01-13 130 views
3

如何在htmlunit中指定cookie政策以接受所有cookie?在htmlunit中的Cookie政策

+0

@Mat Banik,我發佈了一些答案,但它不是很好。 – 2011-01-14 17:58:37

+0

我發現,而不是調整cookie政策,最好是看看爲什麼cookie被拒絕 - 並修復。 – mauhiz 2014-07-15 04:23:53

回答

3

剛剛重建整個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標誌並通過規格匹配(如果這是配置中指定的策略)。

2

有些源代碼修改的解決方案。

  1. 你可以簡單地刪除org.apache.http.client.protocol.ResponseProcessCookiescookieSpec.validate(cookie, cookieOrigin);線的HttpClient

  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不是瀏覽器功能的情況下,你應該修改代碼。