是否有允许这样做的开关/标志?我花了好几个小时找到那些但却找不到有用的东西。我计划做的另一件事是通过添加我自己的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
}
有什么想法吗?
答案 0 :(得分:0)
所以这是一个有效的黑客。诀窍是将请求方法更改为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);
}
});