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
相关产品推荐
相关产品推荐

