通过HttpClient接受所有Cookie

时间:2011-11-26 16:48:46

标签: java android cookies httpclient

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

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

我在我的应用程序中使用一个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来获取响应的String。没什么好看的。

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

2 个答案:

答案 0 :(得分:7)

您面临的问题似乎是出于隐私/安全目的而设计的。通常,不允许任何资源设置它将无法接收的cookie。在这里,您尝试使用资源trackallthethings中的/mobile-api/login.php路径设置Cookie,这显然无效。

这里有以下两个选项

  1. 使用两个资源均可访问的路径设置cookie(可能是root '/')或
  2. 定义自定义Cookie政策并注册您自己的Cookie支持。这是related documentation example
  3. 希望这有帮助。

答案 1 :(得分: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();