Android Studio开发:如何从服务端获取session cookie并设置到API请求头
核心原理
不需要手动从Postman复制、拼接Cookie值,直接利用OkHttp原生的CookieJar拦截机制,即可实现全流程的Cookie自动管理:
- 收到服务器响应时,自动捕获响应头中携带的会话Cookie并持久化到本地
- 发起API请求前,自动取出匹配当前请求域名的有效Cookie,填充到请求头中
- 服务器返回Cookie更新、过期信息时,自动覆盖本地存储的旧值,全程无人工干预
现有代码的常见问题
你当前的实现存在两个导致无法自动获取Cookie的关键问题:
- 每次请求都新建
OkHttpClient实例,无状态的临时客户端无法保留上次请求拿到的会话信息,必须将客户端做成全局单例,全应用复用 - 登录请求中手动硬编码的旧Cookie属于冗余逻辑,登录初始状态本就没有有效会话,手动添加的过期Cookie反而可能干扰正常登录流程
分步实现
1. 实现本地Cookie持久化
通过实现OkHttp原生的CookieJar接口,将登录获取的Cookie存储在应用本地的SharedPreferences中,实现Cookie的长期留存:
public class LocalCookieStore implements CookieJar { private final SharedPreferences cookieSp; // 初始化时绑定本地存储实例 public LocalCookieStore(Context context) { cookieSp = context.getSharedPreferences("api_session_store", Context.MODE_PRIVATE); } // 响应返回时自动触发:存储服务器下发的Cookie @Override public void saveResponseHeaders(HttpUrl url, List<Cookie> cookies) { SharedPreferences.Editor editor = cookieSp.edit(); for (Cookie cookie : cookies) { // 以Cookie名称+请求域名作为存储键,避免不同服务的Cookie冲突 String storeKey = cookie.name() + "@" + url.host(); editor.putString(storeKey, cookie.toString()); } editor.apply(); } // 发起请求前自动触发:取出匹配域名的Cookie用于请求头填充 @Override public List<Cookie> loadRequestHeaders(HttpUrl url) { List<Cookie> matchedCookies = new ArrayList<>(); Map<String, ?> allStoredCookies = cookieSp.getAll(); for (Map.Entry<String, ?> entry : allStoredCookies.entrySet()) { // 筛选当前请求域名下的所有本地存储Cookie if (entry.getKey().endsWith("@" + url.host())) { matchedCookies.add(Cookie.parse(url, (String) entry.getValue())); } } return matchedCookies; } }
2. 初始化全局复用的OkHttpClient
在Application启动阶段完成客户端初始化,绑定自定义的Cookie持久化能力,后续所有请求都复用这个单例客户端,不需要重复新建:
// Application类的onCreate方法中完成初始化 public class MyApp extends Application { public static OkHttpClient apiClient; @Override public void onCreate() { super.onCreate(); apiClient = new OkHttpClient.Builder() .cookieJar(new LocalCookieStore(this)) // 绑定自动Cookie处理逻辑 .build(); } }
3. 简化业务请求逻辑
配置完成后,直接使用全局的apiClient发起请求,完全移除手动添加Cookie头的代码即可:
RequestBody loginBody = new MultipartBody.Builder().setType(MultipartBody.FORM) .addFormDataPart("username", "zee@earthonetechno.com") .addFormDataPart("password", "E1234567") .build(); Request loginRequest = new Request.Builder() .url("http://192.168.1.51/auth/login") .method("POST", loginBody) .addHeader("User-Agent", "Koala Admin") .build(); // 执行请求 Response loginResponse = MyApp.apiClient.newCall(loginRequest).execute();
注意:请求URL必须补全http/https协议头,否则会抛出URL格式解析异常
实现效果
- 登录接口正常返回会话Cookie后,后续所有同域名下的API请求,会自动携带存储的
session=xxx值,完全不需要手动复制、拼接Cookie - 服务器返回新的会话Cookie时,本地存储的旧值会被自动覆盖,不存在过期值残留的问题
- 应用重启后,存储在SharedPreferences中的Cookie不会丢失,不需要每次打开应用重新手动粘贴Cookie
内容的提问来源于stack exchange,提问作者JASIM CHOUHAN
相关产品推荐
相关产品推荐

