在默认cookiestore中手动设置cookie并在okhttp请求中使用它

时间:2014-09-23 20:59:00

标签: android cookies okhttp cookiemanager

在我的Android应用程序中,我正在迁移到okhttp并需要为默认cookieStore中的登录用户手动设置PHPSESSID,这样他们就不会被注销。我使用以下代码手动设置cookie。

((CookieManager)client.getCookieHandler()).getCookieStore().add(new URI("http://www.example.com"), new HttpCookie("PHPSESSID", getPhpSessionID()));

似乎设置了cookie,因为我可以使用此代码获取cookie

((CookieManager)client.getCookieHandler()).getCookieStore().get(new URI("http://www.example.com"));

但是,当我使用

执行客户端调用时
Request request = new Request.Builder().url("http://www.example.com/getdata.php").build(); 
client.newCall(request).execute();

请求中未发送cookie(使用android代理验证此网络呼叫)。

设置这样一个cookie的正确方法是什么,以便okhttp客户端使用该cookie?

1 个答案:

答案 0 :(得分:6)

CookieHandler put CookieManagerCookieStore add的实施似乎有所不同方法。

默认情况下,如果您使用put中的CookieManager,则会添加域和实施内部创建的HttpCookie的路径。如果您直接使用CookieStore的添加方法,则不会发生这种情况,因为您负责创建HttpCookie

事实证明,OkHttp使用了实施中的get,在您的情况下将CookieManager而不是CookieStoreget也会使用path来匹配您的案例中缺少的Cookie。

如果您未提供" /"的预期默认路径。到HttpCookie您的Cookie将无法找到。

然后,您应该修改HttpCookie,如此

HttpCookie cookie = new HttpCookie("PHPSESSID", getPhpSessionID());
cookie.setPath("/");
cookie.setVersion(0);
cookie.setDomain("www.example.com");
((CookieManager)client.getCookieHandler()).getCookieStore().add(new URI("http://www.example.com"), cookie);

或者为了让您的解决方案更适应您更改CookieHandler实施的可能性,您只能使用界面而不是访问CookieStore

你会像这样完成这个

List<String> values = new ArrayList<>(Arrays.asList("PHPSESSID=" + "your_session_id_here"));
Map<String, List<String>> cookies = new HashMap<>();
cookies.put("Set-Cookie", values);
client.getCookieHandler().put(new URI("http://www.example.com"), cookies);