在我的 Android 应用程序中,我正在连接到一个安全站点,其中我的登录凭据包含在自定义标头中。我能够成功登录,因为自定义标头是随新页面请求一起发送的。 根据我的自定义标头信息,我的设备启用了特定的页面功能。问题是,当我登录后从主页加载资源时,我在 webview.LoadUrl(); 中指定的自定义标头;没有发送。因此,最终结果是我可以登录,但没有收到与我的设备关联的特殊功能。
我已经尝试过这两种覆盖。 shouldOverrideUrlLoading 似乎在更改 URL 时有效,但 shouldInterceptRequest 似乎没有在资源请求上被调用?如果是我的实现不起作用?
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
request.getRequestHeaders().putAll(getExtraHeaders());
return super.shouldInterceptRequest(view, request);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url, getExtraHeaders());
return false;
}
看看这对你是否更有效:
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.post(new Runnable() {
@Override
public void run() {
view.loadUrl(url, getExtraHeaders());
}
});
// true means: yes, we are overriding the loading of this url
return true;
}
此附加代码只是建议/大纲,不应被视为剪切/粘贴就绪代码
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
String mimetype;
String encoding;
Map<String, String> headers = new HashMap<>();
headers.putAll(request.getRequestHeaders());
headers.putAll(getExtraHeaders());
URL url = request.getUrl().toString();
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
for (String key : headers.keySet()) {
conn.setRequestProperty(k, headers.get(k));
// TODO look for the mimetype and encoding header information and set mimetype and encoding
}
// return null here if you decide to let the webview load the resource
return new WebResourceResponse(mimetype, encoding, conn.getInputStream());
}
也许尝试不同的方法,使用 WebKit 的 CookieManager 将您需要的任何内容存储在主机的 cookie 中,并使用请求的 cookie 标头而不是自定义标头