5

在我的 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 的正确方法是什么?

4

1 回答 1

7

和'方法的CookieHandler'put实现之间似乎存在差异。CookieManagerCookieStoreadd

默认情况下,如果您使用putfrom ,CookieManager它会将域和路径添加到HttpCookie实现内部创建的路径。如果您CookieStore直接使用 的 add 方法,则不会发生这种情况,因为您是负责创建HttpCookie.

事实证明,在您的情况下OkHttp使用getfrom 实现,CookieManager而不是CookieStore直接使用。这get也将使用path匹配在您的情况下将丢失的cookie。

如果您没有向您HttpCookie的 cookie 提供预期的“/”默认路径,则将找不到您的 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);
于 2014-09-24T19:28:39.697 回答