You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android WebView登录Cookie随机丢失问题排查求助

核心问题分析

你的代码存在几个关键问题,直接导致Cookie随机丢失:

  1. Cookie保存时机错误:当前每个页面加载完成都会执行保存操作,若某些页面请求后服务器返回空Cookie或覆盖了有效令牌Cookie,会直接冲掉SharedPreferences里的有效Cookie。
  2. Domain格式错误:websiteDomain带了https://前缀,而Cookie的domain要求是纯主机名(如10.0.4.12),带协议会导致Cookie无法正确绑定到目标域名,WebView后续请求不会携带。
  3. 重复加载Cookie冲突:onResume中每次都调用加载Cookie的方法,会覆盖WebView会话期间已更新的有效Cookie,造成新旧Cookie冲突丢失。
  4. Cookie存储格式隐患:直接拼接所有Cookie字符串存储,可能在重新设置时丢失expires、httpOnly等关键属性。

针对性修复方案

1. 修正Domain格式

将域名改为纯主机名,去掉协议前缀:

private String websiteDomain = "10.0.4.12";

2. 优化Cookie保存时机

仅在确认Cookie包含有效令牌时保存,避免无效覆盖:

@Override
public void onPageFinished(WebView view, String url) {
    CookieManager cookieManager = CookieManager.getInstance();
    String cookies = cookieManager.getCookie(url);
    // 替换成你的令牌Cookie键名,比如你的令牌是access_token就判断contains("access_token")
    if (cookies != null && cookies.contains("token_key")) {
        saveCookiesToSharedPreferences(url);
    }
    printCookies(url);
}

3. 调整Cookie加载逻辑

只在WebView初始化时加载一次Cookie,避免onResume重复加载覆盖新Cookie:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    // ... 其他初始化代码 ...
    loadCookiesFromSharedPreferences(); // 仅初始化时加载一次
    webView.setWebViewClient(new WebViewClient() {
        // ... 其他回调逻辑 ...
    });
    webView.loadUrl("https://" + websiteDomain + "/auth/last");
}

@Override
protected void onResume() {
    super.onResume();
    // 移除这里的loadCookiesFromSharedPreferences调用
    webView.onResume();
}

4. 完善Cookie存储与加载逻辑

确保每个Cookie属性都被正确处理,避免格式错误:

private void saveCookiesToSharedPreferences(String url) {
    CookieManager cookieManager = CookieManager.getInstance();
    String cookies = cookieManager.getCookie(url);
    if (TextUtils.isEmpty(cookies)) return;
    
    // 使用全局SharedPreferences而非Activity私有模式,避免页面销毁后数据丢失
    SharedPreferences preferences = getSharedPreferences("webview_cookies", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = preferences.edit();
    editor.putString("saved_cookies", cookies);
    editor.apply();
    // 立即刷入磁盘,防止进程被杀导致数据丢失
    cookieManager.flush();
}

private void loadCookiesFromSharedPreferences() {
    SharedPreferences preferences = getSharedPreferences("webview_cookies", Context.MODE_PRIVATE);
    String cookies = preferences.getString("saved_cookies", "");
    if (TextUtils.isEmpty(cookies)) return;
    
    CookieManager cookieManager = CookieManager.getInstance();
    // 先清除旧Cookie,避免冲突
    cookieManager.removeAllCookies(null);
    cookieManager.flush();
    // 逐个设置Cookie,确保每个属性都生效
    String[] cookieArray = cookies.split("; ");
    for (String cookie : cookieArray) {
        cookieManager.setCookie(websiteDomain, cookie);
    }
    cookieManager.flush();
}

5. 额外注意事项

  • 确认服务器返回的Cookie包含正确的expires或max-age属性,时间格式需符合HTTP标准。
  • 排查应用内是否有其他清除Cookie的逻辑,或第三方清理工具是否会删除应用数据。
  • Android 11+需确保应用拥有正常的存储权限,保证SharedPreferences可读写。

验证方法

登录成功后查看Log中的Cookie内容,确认令牌存在;退出应用重新打开,检查WebView是否自动携带Cookie进入登录后的页面,持续观察是否再出现随机丢失情况。

内容的提问来源于stack exchange,提问作者Aran Bins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 05:24:52