是否有允许执行此操作的开关/标志?我花了几个小时找到这些,但找不到任何有效的方法。我打算做的另一件事是通过添加我自己的cefRequest
拦截CefRequestHandler
,检查资源类型,如果它与RT_IMAGE
匹配,则取消请求。除了我必须取消请求的那一部分外,其他一切似乎都很容易。如何停止/阻止/取消cefRequest
?我可能不应该这样做,但是无论如何它是行不通的:
public class CefClientRequestHandler extends CefRequestHandlerAdapter {
@Override
public boolean onBeforeResourceLoad(CefBrowser cefBrowser, CefFrame cefFrame, CefRequest cefRequest) {
if (cefRequest.getResourceType().equals(CefRequest.ResourceType.RT_IMAGE)) {
cefRequest.setURL("");
}
return false;
}
// more overides
}
有任何想法吗?
最佳答案
所以这是一个可行的技巧。技巧是将Request Method更改为HEAD,并且由于HEAD请求未返回正文,因此图像不会成为响应的一部分。
public class CefClientRequestHandler extends CefRequestHandlerAdapter {
@Override
public boolean onBeforeResourceLoad(CefBrowser cefBrowser, CefFrame cefFrame, CefRequest cefRequest) {
if (cefRequest.getResourceType().equals(RT_IMAGE)) {
cefRequest.setMethod("HEAD");
}
return false;
}
// other overridden methods here...
}
我认为应避免这种方法,主要是因为以下两个原因:
将方法从GET更改为HEAD不会阻止CEF向服务器发出请求。打开连接和处理请求的开销仍然存在,这使其比简单地阻止请求慢。
我不确定是否可以从浏览器缓存中获取不显示图像。目前,我不知道有什么方法可以测试这一点。欢迎提出建议。
编辑1:
在我在问题中发布的示例中,更改URL无效,因为我将空字符串传递为新URL。如果我们将URL设置为不是“活动”域名的某个地址(例如https://absolutegarbage-sdjdjfbskdfb.com),则对该资源的请求将立即失败:
@Override
public boolean onBeforeResourceLoad(CefBrowser cefBrowser, CefFrame cefFrame, CefRequest cefRequest) {
if (cefRequest.getResourceType().equals(CefRequest.ResourceType.RT_IMAGE)) {
cefRequest.setURL("https://yghjbnbk.com");
System.out.println("LOL!");
}
return false;
}
您可能会猜到,这仍然不是最佳解决方案。如果有人找到了更好的解决方案,请发表答案或评论。
编辑2:最后,由于用户amaitland,我有了一个干净的工作解决方案。设置
CefAppHandler
时,我们只需要传递一个命令行开关即可。我们可以这样重写方法onBeforeCommandLineProcessing
来做到这一点:CefApp.addAppHandler(new CefAppHandlerAdapter(null) {
@Override
public void onBeforeCommandLineProcessing(String s, CefCommandLine cefCommandLine) {
cefCommandLine.appendSwitch("disable-image-loading");
}
@Override
public void stateHasChanged(CefApp.CefAppState state) {
if (state == CefApp.CefAppState.TERMINATED) System.exit(0);
}
});