【问题标题】:Accept All Cookies via HttpClient通过 HttpClient 接受所有 Cookie
【发布时间】:2012-01-06 23:24:15
【问题描述】:

所以这就是我的应用程序目前的设置方式:

1.) 登录活动。 2.) 登录后,可能会启动其他使用 PHP 脚本的活动,这些脚本需要登录时发送的 cookie。

我在我的应用程序中使用了一个 HttpClient 以确保使用相同的 cookie,但我的问题是 3 个 cookie 中有 2 个被拒绝。我不关心 cookie 的有效性,但我确实需要它们被接受。 I tried setting the CookiePolicy,但这也没有用。这就是 logcat 的意思:

11-26 10:33:57.613: WARN/ResponseProcessCookies(271): Cookie rejected: "[version: 0]      [name: cookie_user_id][value: 1][domain: www.trackallthethings.com][path: trackallthethings][expiry: Sun Nov 25 11:33:00 CST 2012]". Illegal path attribute "trackallthethings". Path of origin: "/mobile-api/login.php"

11-26 10:33:57.593: WARN/ResponseProcessCookies(271): Cookie rejected: "[version: 0][name: cookie_session_id][value: 1985208971][domain: www.trackallthethings.com][path: trackallthethings][expiry: Sun Nov 25 11:33:00 CST 2012]". Illegal path attribute "trackallthethings". Path of origin: "/mobile-api/login.php"

我确定我的实际代码是正确的(我的应用仍然可以正确登录,只是不接受上述 cookie),但无论如何:

HttpGet httpget = new HttpGet(//MY URL);
HttpResponse response;
response = Main.httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
InputStream in = entity.getContent();

BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder sb = new StringBuilder();

从这里我使用 StringBuilder 来简单地获取响应的字符串。没什么特别的。

我了解我的 cookie 被拒绝的原因是由于“非法路径属性”(我在 /mobile-api/login.php 运行脚本,而 cookie 将返回路径仅为“/”用于trackallthethings),但无论如何我都愿意接受cookies。有没有办法做到这一点?

【问题讨论】:

    标签: java android cookies httpclient


    【解决方案1】:

    您面临的问题似乎是出于隐私/安全目的而设计的。一般来说,任何资源都不允许设置它无法接收的 cookie。在这里,您尝试使用来自资源 /mobile-api/login.php 的路径 trackallthethings 设置 cookie,这显然不起作用。

    这里有两个选项

    1. 使用两个资源都可以访问的路径设置 cookie(这可能是 root '/')或
    2. 定义自定义 cookie 策略并注册您自己的 cookie 支持。这里是related documentationexample

    希望这会有所帮助。

    【讨论】:

    • 这绝对是正确的答案。我以为我做错了什么,但事实证明我的项目合作伙伴正在分发路径不正确的 cookie。 :-)
    【解决方案2】:

    由于HttpClient 的 API 似乎变化非常快,以下是HttpClient 4.5.1 的一些工作示例代码,以允许所有(格式错误的)cookie:

    class EasyCookieSpec extends DefaultCookieSpec {
        @Override
        public void validate(Cookie arg0, CookieOrigin arg1) throws MalformedCookieException {
            //allow all cookies 
        }
    }
    
    class EasySpecProvider implements CookieSpecProvider {
        @Override
        public CookieSpec create(HttpContext context) {
            return new EasyCookieSpec();
        }
    }
    
    Registry<CookieSpecProvider> r = RegistryBuilder.<CookieSpecProvider>create()
                .register("easy", new EasySpecProvider())
                .build();
    
    CookieStore cookieStore = new BasicCookieStore();
    
    RequestConfig requestConfig = RequestConfig.custom()
                .setCookieSpec("easy")
                .build();
    
    CloseableHttpClient httpclient = HttpClients.custom()
                .setDefaultCookieStore(cookieStore)
                .setDefaultCookieSpecRegistry(r)
                .setDefaultRequestConfig(requestConfig)
                .build();
    

    【讨论】:

    • 我遇到了这个代码的问题。它似乎不允许所有格式错误的 cookie。例如,我在使用简单的 Java Date 类时看到我提供的一些身份验证令牌出现Invalid 'expires' attribute 异常。 Sat, 16-Sep-2017 20:06:21 GMT > 有效 Fri, 24 Mar 2017 20:46:08 GMT > 无效
    猜你喜欢
    • 2019-10-03
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多