在我的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?
似乎有成为之间的差异CookieHandler
的put
实施CookieManager
和CookieStore
的add
方法.
默认情况下,如果您使用put
from,CookieManager
它将添加域和HttpCookie
实现内部创建的路径.如果您CookieStore
直接使用add方法,那么就不会发生这种情况,因为您负责创建HttpCookie
.
事实证明,OkHttp
使用get
来自您的情况下的实现CookieManager
而不是CookieStore
直接实现.这get
也将使用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);