我目前正在使用此代码向android WebView
Map<String, String> extraHeaders = new HashMap<String, String>();
extraHeaders.put("example", "header");
webView.loadUrl(url, extraHeader);
以上代码正在运行但仅在主页上。因此,如果我编写此代码echo $_SERVER['example']
,则会打印header
。但是在加载的URL中有iframe
,当我尝试相同的代码时,它会显示未定义的错误。有什么办法可以解决这个问题吗?
所以我想要做的是将自定义标题不仅添加到主加载的URL,还添加到加载页面的iframe
。
答案 0 :(得分:3)
这对我有用:
mWebView.setWebViewClient(new MyWebViewClient(token));
MyWebViewClient中的
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
try {
OkHttpClient httpClient = new OkHttpClient();
Request request = new Request.Builder()
.url(url.trim())
.addHeader("token", mToken) //add headers
.build();
Response response = httpClient.newCall(request).execute();
return new WebResourceResponse(
getMimeType(url), // set content-type
response.header("content-encoding", "utf-8"),
response.body().byteStream()
);
} catch (IOException e) {
return null;
}
}
//get mime type by url
public String getMimeType(String url) {
String type = null;
String extension = MimeTypeMap.getFileExtensionFromUrl(url);
if (extension != null) {
if (extension.equals("js")) {
return "text/javascript";
}
else if (extension.equals("woff")) {
return "application/font-woff";
}
else if (extension.equals("woff2")) {
return "application/font-woff2";
}
else if (extension.equals("ttf")) {
return "application/x-font-ttf";
}
else if (extension.equals("eot")) {
return "application/vnd.ms-fontobject";
}
else if (extension.equals("svg")) {
return "image/svg+xml";
}
type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
}
return type;
}
答案 1 :(得分:2)
不,Android WebView本身无法做到这一点。您必须在页面代码,应用程序代码或服务器上进行解决。
要在页面上修复此问题,您可以使用XMLHttpRequest
加载子资源。但为此你基本上可以动态构建页面。
在应用程序方面,您可以使用WebViewClient.shouldInterceptRequest
拦截所有网络请求。您不能仅修改提供的请求,而是需要自己创建新请求,但您可以设置所需的任何标头。请参阅此示例:Android WebViewClient url redirection (Android URL loading system)
在服务器端,您可以查看子资源的Referer
标头,该标头必须包含已请求它的网页的网址。
答案 2 :(得分:0)
您可以将此设置设置为您的网络设置,来自webview的每个请求都将使用此User-Agent
标题。
webview.getSettings().setUserAgentString("user-agent-string");
答案 3 :(得分:0)
只需在加载网址之前添加以下代码即可:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
CookieManager.getInstance().removeAllCookies(null);
}