如何在 CEF/JCEF 中禁用图像加载?

How to disable image loading in CEF/JCEF?

是否有 switch/flag 允许这样做?我花了几个小时找到那些但找不到任何有用的东西。我打算做的另一件事是通过添加我自己的 CefRequestHandler 来拦截 cefRequest,检查资源类型,如果它匹配 RT_IMAGE,则取消请求。一切看起来都很简单,除了我必须取消请求的部分。我如何stop/block/cancel一个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
}

有什么想法吗?

这是一个行之有效的技巧。诀窍是将请求方法更改为 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...
}

我认为应该避免这种做法,主要有以下两个原因:

  1. 将方法从 GET 更改为 HEAD 不会阻止 CEF 向服务器发出请求。打开连接和处理请求的开销仍然存在,这使得它比简单地阻止请求慢。

  2. 我不确定如果图像可从浏览器缓存中获取,是否不会显示。目前,我不知道有什么方法可以测试这个。欢迎提出建议。

编辑 1: 更改 URL 在我 post 问题中的示例中不起作用,因为我传递了一个空字符串作为新的 URL。如果我们将 URL 设置为某个不是 "active" 域名的地址(例如 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;
}

正如您可能猜到的那样,这仍然不是最佳解决方案。如果有人找到更好的解决方案,请post回答或评论。

编辑 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);
    }
});