是否有允许执行此操作的开关/标志?我花了几个小时找到这些,但找不到任何有效的方法。我打算做的另一件事是通过添加我自己的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);
    }
});

07-26 03:53