Kotlin实现持久化Cookie Jar解决Apollo服务器登录状态丢失问题
当前MyCookieJar仅将Cookie存储在内存中,应用重启后内存数据被清空,导致每次都需要重新登录。要解决这个问题,核心是把Cookie持久化到本地存储,下面以Android平台的SharedPreferences为例给出具体实现:
1. 实现持久化CookieJar
private class PersistentCookieJar(private val sharedPrefs: SharedPreferences) : CookieJar { private var cookies: List<Cookie> = loadSavedCookies() // 从本地加载已保存的Cookie private fun loadSavedCookies(): List<Cookie> { val cookiesString = sharedPrefs.getString("saved_cookies", null) ?: return emptyList() return Gson().fromJson(cookiesString, object : TypeToken<List<Cookie>>() {}.type) } // 将Cookie保存到本地 private fun saveCookiesToPrefs(cookies: List<Cookie>) { val cookiesString = Gson().toJson(cookies) sharedPrefs.edit().putString("saved_cookies", cookiesString).apply() } override fun saveFromResponse(url: HttpUrl, cookies: List<Cookie>) { this.cookies = cookies saveCookiesToPrefs(cookies) } override fun loadForRequest(url: HttpUrl): List<Cookie> { // 过滤掉已过期的Cookie,避免无效请求 val validCookies = cookies.filter { !it.expiresAt.isPast } // 如果有Cookie过期,更新本地存储的有效Cookie if (validCookies.size != cookies.size) { this.cookies = validCookies saveCookiesToPrefs(validCookies) } return validCookies } }
2. 初始化ApolloClient时传入持久化CookieJar
在创建ApolloClient的代码中,传入应用的SharedPreferences实例:
val sharedPrefs = context.getSharedPreferences("apollo_cookies", Context.MODE_PRIVATE) val cookieJar = PersistentCookieJar(sharedPrefs) val apolloClient = ApolloClient.builder() .serverUrl("你的Apollo服务器地址") .cookieJar(cookieJar) .build()
额外注意事项
- 若使用Gson序列化Cookie,需在项目的build.gradle中添加依赖:
implementation 'com.google.code.gson:gson:2.10.1' - 部分Cookie可能带有
HttpOnly属性,这类Cookie无法被客户端代码读取和存储,需要服务器端调整Cookie属性,确保登录态Cookie支持客户端持久化。 - 代码中已自动过滤过期Cookie,避免存储无效数据,减少不必要的请求错误。
内容的提问来源于stack exchange,提问作者Sherm13
相关产品推荐
相关产品推荐

