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

Android WebView加载URL时如何清除Basic Authentication身份验证凭据

问题原因

WebView默认会将成功的HTTP身份验证凭据全局缓存到独立的HttpAuthDatabase中,该缓存与普通的网页资源缓存、Cookie缓存完全隔离,因此调用普通的webView.clearCache()等方法无法清除该凭据,导致onReceivedHttpAuthRequest仅首次触发,后续加载会直接复用缓存的凭据不会再触发回调。

解决方案

方案1:专门清除HTTP身份验证缓存

每次加载URL前,调用系统API清除全局HTTP身份验证缓存即可,代码如下:

// 初始化WebView时先清除认证缓存
WebViewDatabase webViewDatabase = WebViewDatabase.getInstance(context);
webViewDatabase.clearHttpAuthUsernamePassword();

webview.setWebViewClient(new MyWebBrowser(userName, password));
webview.loadUrl(BuildConfig.WEBVIEW_URL);

该方案保留原有onReceivedHttpAuthRequest的逻辑即可,无需修改其他代码。


方案2:主动携带认证头绕过缓存机制

如果需要避免依赖回调、或者需要单独控制单个页面的认证逻辑,可以主动在请求头中添加认证信息,直接绕过系统的凭据缓存逻辑,无需等待onReceivedHttpAuthRequest触发:

String credentials = userName + ":" + password;
String authHeader = "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP);
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", authHeader);

webview.setWebViewClient(new MyWebBrowser(userName, password));
webview.loadUrl(BuildConfig.WEBVIEW_URL, headers);

注意:如果是Digest认证场景,需要自行解析响应头的认证参数生成对应的响应值,不适用该简单拼接方式


方案3:URL拼接凭据(临时测试用)

测试场景下可以直接将凭据拼接到URL中,同样可以绕过缓存:

// 用户名和密码需要先做URL编码,避免特殊字符导致解析错误
String encodedUserName = URLEncoder.encode(userName, StandardCharsets.UTF_8.name());
String encodedPassword = URLEncoder.encode(password, StandardCharsets.UTF_8.name());
String loadUrl = String.format("https://%s:%s@%s", encodedUserName, encodedPassword, BuildConfig.WEBVIEW_URL.replace("https://", ""));
webview.loadUrl(loadUrl);

该方案存在凭据泄露风险,不建议生产环境使用

注意事项
  • clearHttpAuthUsernamePassword是全局生效的,会清除当前应用所有WebView实例的HTTP身份验证缓存,如果有多个不同认证的WebView页面需要同时使用,建议使用方案2主动携带认证头。
  • Android 12及以上版本对URL内嵌凭据的适配限制较多,生产环境优先使用方案1或方案2。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:15:03