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

 意华嘉泰6 发布于 2022-12-20 00:52

在我的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 个回答
  • 似乎有成为之间的差异CookieHandlerput实施CookieManagerCookieStoreadd方法.

    默认情况下,如果您使用putfrom,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);
    

    2022-12-20 01:21 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有