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

Android WebView微软SSO登录会话长时间后失效问题求助

问题:Android WebView Microsoft SSO登录会话失效异常

我维护一款Android壳应用,作为网站的封装载体,支持PDF、图片下载及mailto等功能。用户点击登录按钮后,WebView加载指定URL,网站跳转至Microsoft SSO登录页面,完成登录后进入首页。短时间内关闭再打开应用,加载同一URL可直接进入首页;但间隔7-8小时后打开应用,加载该URL会跳转到网站内部登录页,需多次点击返回和登录按钮才能进入首页。iOS端采用相同逻辑无此问题。

当前WebView配置代码

myWebView.setWebViewClient(new MyBrowser());
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.getSettings().setAllowFileAccess(true);
myWebView.isPrivateBrowsingEnabled();
myWebView.getSettings().setAllowContentAccess(true);
myWebView.getSettings().setDatabaseEnabled(true);
myWebView.getSettings().setLoadWithOverviewMode(true);
myWebView.getSettings().setLoadsImagesAutomatically(true);
myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
myWebView.getSettings().setDomStorageEnabled(true);

myWebView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);

myWebView.getSettings().setSavePassword(true);
myWebView.getSettings().setSaveFormData(true);
myWebView.getSettings().setPluginState(WebSettings.PluginState.ON);
myWebView.getSettings().setAllowFileAccessFromFileURLs(true);
myWebView.getSettings().setAllowUniversalAccessFromFileURLs(true);
myWebView.getSettings().setSupportMultipleWindows(true);

myWebView.getSettings().setMixedContentMode(0);
myWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
CookieManager.getInstance().setAcceptCookie(true);

已尝试的解决方案

  • 登录成功后在onFinished方法中获取Cookie,保存至SharedPreferences,加载URL前重新设置到CookieManager;
  • 加载WebView前清除缓存;
  • 设置WebView为无缓存模式;
  • 联系Microsoft技术支持,但对方仅能收到重试成功后的日志,无法获取跳转至内部登录页时的日志。

可能的原因与解决思路

1. Cookie持久化与属性完整性问题

Android WebView默认的Cookie存储可能丢失部分属性(如expires、domain、SameSite),导致长时间后会话失效。

  • 保存Cookie时,使用CookieManager.getInstance().getCookie(url)获取完整的Cookie字符串,拆分每个Cookie的name=value; domain=xxx; path=xxx; expires=xxx属性,逐个存入SharedPreferences;
  • 恢复Cookie时,遍历保存的完整Cookie属性,调用CookieManager.getInstance().setCookie(url, cookieString)逐个设置,确保所有属性被正确恢复。

2. 第三方Cookie与SameSite属性兼容

Android WebView对第三方Cookie的限制比iOS严格,需明确开启第三方Cookie支持,并检查Cookie的SameSite属性:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    CookieManager.getInstance().setAcceptThirdPartyCookies(myWebView, true);
}
  • 确认Microsoft SSO返回的Cookie包含SameSite=None; Secure属性,避免因SameSite限制导致Cookie无法跨域携带。

3. 系统自动清理WebView数据

部分Android系统会自动清理闲置应用的缓存或数据,导致WebView的会话存储被回收:

  • 配置WebView的自定义缓存路径,避免被系统默认清理:
    String cacheDirPath = getFilesDir().getAbsolutePath() + "/webview_persist_cache";
    myWebView.getSettings().setAppCachePath(cacheDirPath);
    myWebView.getSettings().setAppCacheEnabled(true);
    
  • 检查应用是否开启了"自动清理后台数据"权限,或用户是否开启了系统级的应用数据自动清理功能。

4. WebView状态与进程回收处理

短时间内应用关闭后WebView进程可能未被销毁,长时间后进程被回收导致会话丢失:

  • 使用saveState和restoreState保存WebView的页面状态(需配合Cookie持久化):
    // 退出时保存状态
    Bundle webViewState = new Bundle();
    myWebView.saveState(webViewState);
    // 重启时恢复状态
    myWebView.restoreState(webViewState);
    

5. 本地日志排查

通过拦截WebView请求记录Cookie变化,定位会话失效的具体原因:

@Override
public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);
    String cookies = CookieManager.getInstance().getCookie(url);
    Log.d("WebViewSSOCookie", "URL: " + url + " | Cookies: " + cookies);
}

对比短时间和长时间后的Cookie内容,确认是Cookie丢失、属性变化还是网站逻辑导致的跳转异常。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 13:55:54