如何在Android应用中禁用WebView的自动填充流量
Android WebView 自动填充请求拦截与禁用方案
一、从根源禁用自动填充(彻底阻断请求触发)
1. 网页文本框层面(自有页面优先用)
给页面内所有输入框添加autocomplete="off"属性,密码框用autocomplete="new-password"效果更稳定。如果是无法修改的第三方网页,可通过WebView注入JS强制修改:
webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); // 遍历所有输入框,强制关闭自动填充相关功能 view.loadUrl("javascript:(function() { " + "var inputs = document.getElementsByTagName('input'); " + "for(var i=0; i<inputs.length; i++) { " + "inputs[i].setAttribute('autocomplete', 'off'); " + "inputs[i].setAttribute('autocorrect', 'off'); " + "inputs[i].setAttribute('autocapitalize', 'none'); " + "} })()"); } });
2. WebView 全局配置
直接关闭WebView的表单保存与自动填充功能:
WebSettings settings = webView.getSettings(); settings.setSaveFormData(false); // 禁止保存表单数据 settings.setAutocompleteOverrideEnabled(false); // 关闭自动完成(适配部分Android版本) // Android 8.0及以上额外补充 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { webView.setAutofillHints(""); }
3. 应用全局禁用自动填充服务
在AndroidManifest.xml中给WebView所在Activity添加属性:
<activity android:name=".YourWebViewActivity" android:autofillHints="" android:importantForAutofill="no"> </activity>
也可在Activity代码中动态设置:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { getWindow().getDecorView().setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO); }
二、黑名单拦截目标域名(双重保障)
若禁用自动填充后仍有漏网请求,直接拦截content-autofill.googleapis.com:
1. 利用NetworkSecurityConfig配置
在network_security_config.xml中添加黑名单规则:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="false"> <!-- 仅允许自有服务域名 --> <domain includeSubdomains="true">your-own-service.com</domain> <!-- 直接阻断目标域名 --> <domain includeSubdomains="true" blocked="true">content-autofill.googleapis.com</domain> </domain-config> </network-security-config>
需确保在AndroidManifest.xml的application标签中引用该配置:android:networkSecurityConfig="@xml/network_security_config"
2. WebViewClient拦截请求
重写shouldInterceptRequest方法,碰到目标域名直接返回空响应:
webView.setWebViewClient(new WebViewClient() { @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { String url = request.getUrl().toString(); if (url.contains("content-autofill.googleapis.com")) { // 截断请求,返回空响应 return new WebResourceResponse(null, null, null); } return super.shouldInterceptRequest(view, request); } });
3. 应用层网络拦截(如OkHttp)
如果WebView使用自定义OkHttpClient,可添加拦截器拦截目标域名:
OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(chain -> { Request request = chain.request(); String url = request.url().toString(); if (url.contains("content-autofill.googleapis.com")) { throw new IOException("Blocked by security policy"); } return chain.proceed(request); }) .build(); // Android 10+ 可通过WebViewAssetLoader将OkHttpClient绑定到WebView
三、管控结论
完全可以实现管控,优先采用禁用自动填充的方案从根源避免请求触发;拦截方案作为兜底保障,双重措施可彻底阻止该域名的请求,满足安全要求。
内容的提问来源于stack exchange,提问作者Rameez Hussain
相关产品推荐
相关产品推荐

