Android WebView自定义标头

时间:2015-08-20 18:38:54

标签: java android webview header

我目前正在使用此代码向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

4 个答案:

答案 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);
}