我有一个 webview Activity ,它在其 onCreate() 方法中加载一个带有一些自定义请求 header 的 URL。要求是通过初始 URL 请求传递自定义 header 。在一些设备上,webview Activity 启动几次后,webview 停止发送 header 。
例如,我有一个启动 WebViewActivity 的 HomeActivity。在启动 WebViewActivity 并导航回 HomeActivity 几次后,WebViewActivity 停止发送自定义请求 header 并且此行为不会改变,除非我清除应用程序的数据。
我已经使用 MITM 工具确认了此行为。实现如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
Map<String, String> map = new HashMap<>();
map.put("header1", "header1_value");
map.put("header2", "header2_value");
map.put("header3", "header3_value");
map.put("header4", "header4_value");
webView.loadUrl("https://www.example.com/mypath", map);
}
以上代码段在每次 Activity 启动时无条件执行。但是, header 不存在于 webview 发出的实际请求中。此外,请求的页面是 303 重定向。
最佳答案
如果您的最低 API 目标是级别 21,您可以使用 shouldInterceptRequest否则你可以使用 this
每次拦截,您都需要获取 url,自己发出此请求,并返回内容流:
然后:
WebViewClient wvc = new WebViewClient() {
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
try {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
httpGet.setHeader("header1", "header1_value");
httpGet.setHeader("header2", "header2_value");
httpGet.setHeader("header3", "header3_value");
httpGet.setHeader("header4", "header4_value");
HttpResponse httpReponse = client.execute(httpGet);
Header contentType = httpReponse.getEntity().getContentType();
Header encoding = httpReponse.getEntity().getContentEncoding();
InputStream responseInputStream = httpReponse.getEntity().getContent();
String contentTypeValue = null;
String encodingValue = null;
if (contentType != null) {
contentTypeValue = contentType.getValue();
}
if (encoding != null) {
encodingValue = encoding.getValue();
}
return new WebResourceResponse(contentTypeValue, encodingValue, responseInputStream);
} catch (ClientProtocolException e) {
//return null to tell WebView we failed to fetch it WebView should try again.
return null;
} catch (IOException e) {
//return null to tell WebView we failed to fetch it WebView should try again.
return null;
}
}
}
//Where wv is your webview
wv.setWebViewClient(wvc);
基于此question
关于Android WebView 有时不会在初始页面加载时发送请求 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54868993/