zoukankan      html  css  js  c++  java
  • Htmlunit / HttpClient 报 Cookie rejected 警告 的解决方案。

    今天下午用 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可以通吃。

    最后介绍个学习网站:here

  • 相关阅读:
    git切换到指定分支,git新建分支与合并
    别克英朗更换空调滤网与发动机空气滤网
    杭州市浙A区域号牌正则表达式
    新史记·特斯拉怒怼民女传
    史记 袁隆平传
    抵押贷款国五车辆,非浙A(外地)转浙A(摇号),本人名下电子转籍流程
    // TPLINK WR882N/TL-WR842N管理脚本
    netsh用法
    百度AI车号牌照片识别
    .htaccess 301重定向 http https 多域名
  • 原文地址:https://www.cnblogs.com/cha1r/p/3414694.html
Copyright © 2011-2022 走看看