android - 如何使用 okhttp3 和 PersistentCookieStore 访问 cookie 并检查它是否已过期?

标签 android cookies okhttp

我正在开发一个 Android 应用程序,其中向网络服务发出登录后请求。该请求返回一个 20 分钟后过期的 cookie。

使用 okhttp3 和这个 PersistentCookieStore库,我得到了要存储的 cookie,随后将其添加为请求 header 以访问需要身份验证的获取请求(例如,非公开的个人信息)。

代码是这样的,

CookieJar myCookieJar = new PersistentCookieJar(new SetCookieCache(), 
new SharedPrefsCookiePersistor(this));

OkHttpClient client = new OkHttpClient.Builder().cookieJar(HttpRequests.cookieJar).build();

然后我在异步任务中调用类似这样的方法(在我完成另一个登录异步任务以获取 cookie 之后)异步任务来执行需要身份验证的获取请求,

public static String PostReq(String url, String json) {
    RequestBody body = RequestBody.create(JSON, json);
    Request request = new Request.Builder()
            .url(url)
            .addHeader("Cookie", "key=value")
            .post(body)
            .build();
    try (Response response = client.newCall(request).execute()) {
        return response.body().string();
    }
    catch(Exception e){

    }
}

.addHeader("Cookie", "key=value") 将 cookie 添加到 header 以告知网络服务我已通过身份验证。

我的难处来了。由于 cookie 在 20 分钟后过期,我希望能够访问 cookie 本身以检查过期时间,并可能通过调用方法将用户重定向到登录 Activity ,

myCookie.expiresAt() 

并将其与

进行比较
System.currentTimeMillis()

我试图查看 PersistentCookieStore 代码,发现它使用带有键“CookiePersistence”的 SharedPreference。当我的模拟器运行应用程序时,我查看了这个文件,发现它是空的。

我怎样才能访问我获得的这个 cookie?非常感谢您提供任何建议。

最佳答案

好吧,这是旧的,但我遇到了同样的问题,这是我解决它的方法。

保留对用于实例化 CookieJarSetCookieCache 的引用:

SetCookieCache cookieCache = new SetCookieCache();
CookieJar myCookieJar = new PersistentCookieJar(
   cookieCache, 
   new SharedPrefsCookiePersistor(this)
);

然后使用它来查找您的 cookie 并检查它:

  for (Cookie cookie : cookieCache) {
     if (cookie.name().equals("cookie_name") && cookie.persistent()) {
        //cookie is still good
        break;
     }
  }

或者使用 cookie.expiresAt() 来做你的事。

关于android - 如何使用 okhttp3 和 PersistentCookieStore 访问 cookie 并检查它是否已过期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47197335/

相关文章:

android - 在 Android 中反转音频文件

javascript - 使用jQuery或JavaScript在下一页打开相同的div以记住

javascript - 如何实现网站的cookies scraper?

android - 如何在从站点下载和解析 XML 文件时一起使用 Retrofit 和 SimpleXML?

android - 你如何让 Idling 资源在 Kotlin 中与协程一起工作

java - 使用 GSON 给出的错误预期为 BEGIN_ARRAY,但实际为 STRING

android - 按下后退按钮时 fragment 不刷新

Android:如何在 onReceive 中将短信标记为已读

google-chrome - Opera 如何复制 Chrome cookie

java - 拦截查询字符串