Java Android WebView自定义标题

Java Android WebView自定义标题,java,android,webview,header,Java,Android,Webview,Header,我目前正在使用此代码向androidWebView Map<String, String> extraHeaders = new HashMap<String, String>(); extraHeaders.put("example", "header"); webView.loadUrl(url, extraHeader); Map extraHeaders=newhashmap(); extraHeaders.put(“示例”、“标题”); loadUrl(url

我目前正在使用此代码向android
WebView

Map<String, String> extraHeaders = new HashMap<String, String>();
extraHeaders.put("example", "header");
webView.loadUrl(url, extraHeader);
Map extraHeaders=newhashmap();
extraHeaders.put(“示例”、“标题”);
loadUrl(url,extraHeader);
上面的代码正在工作,但仅在主页上。因此,如果我编写这段代码
echo$\u服务器['example']
它将打印
标题
。但是在加载的URL中有一个
iframe
,当我尝试相同的代码时,它显示了一个未定义的错误。我有办法解决这个问题吗


因此,我想做的是不仅在加载的主URL中添加自定义标题,而且在加载页面的
iframe
上添加自定义标题。

不,这在Android WebView本身中是不可能的。您必须在页面代码、应用程序代码或服务器上进行修改

为了解决这个问题,可以使用
XMLHttpRequest
加载子资源。但对于这一点,您基本上必须动态构建页面

在应用程序方面,您可以使用
WebViewClient.shouldInterceptRequest
,拦截所有网络请求。您不允许只修改提供的请求,相反,您需要自己提出一个新的请求,但是您可以在那里设置任何您想要的头。请参见此示例:

在服务器端,您可以查看子资源的
Referer
标题,该标题必须包含请求它的页面的url。

这对我很有用:

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;
}

您可以将此设置放到web设置中,来自webview的每个请求都将使用此
用户代理
标题


webview.getSettings().setUserAgentString(“用户代理字符串”)

只需在加载URL之前添加此代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        CookieManager.getInstance().removeAllCookies(null);
}

您将在何处添加此项?它仅适用于设置用户代理而不是自定义标题!是的,此代码仅用于设置您的用户代理头而不是自定义头,您可以在
onCreate
中输入删除Cookie与添加头的关系的可能副本?