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

时间:2018-04-12 17:57:46

标签: java filter chromium chromium-embedded interception

是否有允许这样做的开关/标志?我花了好几个小时找到那些但却找不到有用的东西。我计划做的另一件事是通过添加我自己的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
}

有什么想法吗?

1 个答案:

答案 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...
}

我认为应该避免这种方法主要是因为以下两个原因:

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

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

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