WebView 中 Cookie 丢失怎么办?跨域状态不同步的调试与修复经验
现代 App 内的 WebView 页面常涉及多个业务域名:主域名提供用户登录、其他二级域名承载活动或内容页。理想情况下 Cookie 能跨子域共享用户状态,但在 WebView 中却经常遇到 Cookie 丢失、登录态失效、或者主域和子域状态不同步的问题。
这些问题在浏览器中难以复现,却在部分移动端 WebView 环境中频发,成为线上最难定位的“偶发 bug”之一。
背景:部分用户反馈活动页被频繁登出
某次活动页部署在 m.example.com,而用户登录态保存在 example.com 下。大部分用户在 WebView 中访问活动页可自动携带登录 Cookie,但部分用户频繁被提示“请先登录”,且再次登录后仍会短时间内失效。
后端确认登录接口已成功签发有效 Cookie,但活动域名的请求中未携带登录信息。
第一步:确认 Cookie 是否正常写入
使用 WebDebugX 在问题设备上连接活动页面,执行:
console.log("document.cookie:", document.cookie);
发现活动页里没有名为 auth_token
的 Cookie,而主站页面里能正常打印出 auth_token
。
第二步:分析域名与 Cookie 设置
后端在登录接口中设置 Cookie:
Set-Cookie: auth_token=xxx; Domain=example.com; Path=/; Secure; HttpOnly
按理说,example.com 下设置的 Cookie 应在所有 *.example.com 子域名有效。然而部分 Android 低版本 WebView(如 5.0-6.0)对跨域 Cookie 兼容性差,无法自动同步 Cookie。
第三步:验证 WebView 设置与系统差异
协助移动端同事查看 App WebView 初始化代码,发现部分老版本 App 并未显式开启 Cookie 同步功能,未在 WebView 初始化时执行以下逻辑:
CookieManager.getInstance().setAcceptCookie(true);
CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true);
这导致即便登录接口下发了跨域 Cookie,WebView 仍不会存储或携带到子域名页面。
第四步:临时方案验证
为确认修复方向,我们在 WebDebugX 中手动设置 Cookie:
document.cookie = "auth_token=xxx; domain=.example.com; path=/";
刷新页面后请求活动域接口,再次观察 Charles 抓包,确认请求头中已包含 auth_token
,后端不再返回未登录错误,问题被还原并定位。
第五步:修复与上线方案
针对 Cookie 丢失问题,我们采用双向修复:
短期解决:App 端热修复
移动端在 WebView 初始化中补充 Cookie 设置,使 WebView 能跨域保存和使用 Cookie。
长期方案:统一 Token 传参
将 auth_token 在登录后写入 HTML 页面,通过 JSBridge 传递到 WebView,再存储到 Web localStorage,并在每次请求时通过 header 或参数带上 Token,避免 Cookie 依赖。
第六步:多场景回归验证
QA 使用 Vysor 模拟以下情况进行验证:
- 已登录状态下访问主域再跳转活动域,Cookie 能否携带;
- 活动域页面是否在 App 冷启动后依然能维持登录状态;
- Android/iOS 不同系统版本表现是否一致;
- 弱网、网络切换等情况下 Cookie 是否丢失。
工具与职责分工
此次问题排查,我们使用的工具与分工如下:
工具 | 用途 | 使用人 |
---|---|---|
WebDebugX | 查看/设置 Cookie、验证状态同步 | 前端 / QA |
Charles | 抓取请求是否携带 Cookie | 前端 |
Logcat | 查看 WebView 初始化日志、Cookie 同步日志 | 移动端 |
Vysor | 模拟多次启动和网络切换,录制 Cookie 表现 | QA |
结语:Cookie 跨域问题的本质是“环境差异”
浏览器对 Cookie 的跨域行为有相对统一的实现,但 WebView 在不同 Android/iOS 版本、不同厂商实现中有明显差异。调试此类问题要:
在真机上验证 Cookie 写入与读取;
检查 WebView 是否显式开启跨域 Cookie 支持;
结合后端返回的 Set-Cookie 域设置;
考虑兼容性时,准备无 Cookie 依赖的 Token 方案。
调试工具(WebDebugX、Charles、Vysor)能帮助我们在设备中观察 Cookie 行为,从而精准验证跨域状态同步。