【问题标题】:Chrome webRequest listening to only user entered URLsChrome webRequest 只监听用户输入的 URL
【发布时间】:2016-03-24 18:32:16
【问题描述】:

我正在制作一个 Chrome 扩展程序,它只允许用户访问给定白名单上的网站。 chrome.webRequest.onBeforeRequest 非常适合拦截和检查 URL,但我遇到的问题是它会检查所有传入的 URL,包括网页何时尝试加载资源。我希望它只检查用户输入的 URL,如果该 URL 在白名单上,我希望它允许该网页加载它需要的任何资源,无论它们是否在白名单上。

这是我的监听器代码。

    chrome.webRequest.onBeforeRequest.addListener(
      function(info) {
        console.log("URL: " + info.url);
        var pageURL = info['url'];
        let mngwlst = new ManageWhitelist();
        var whitelist = mngwlst.getWhitelist();
        if(whitelist == null) mngwlst.setWhitelist([]);
        var denyRequest = false;
        var denyRequest = monitor.ExamineWhitelist(pageURL, whitelist);
        console.log(denyRequest);
        return {cancel: denyRequest}
    },

    {
        urls: [
        "<all_urls>"
        ],
    },

    ["blocking"]);

monitor.ExamineWhitelist(pageURL, whitelist) 将根据 URL 是否在白名单中返回 true 或 false。

【问题讨论】:

  • 我知道这个问题是专门针对 webRequest 提出的,但请务必查看 webNavigation (Firefox docsChrome docs),因为它与用户 URL 栏中显示的内容更密切相关。跨度>

标签: javascript google-chrome google-chrome-extension


【解决方案1】:

尝试仅过滤“用户输入”的 URL 很棘手,但这里可能对您有所帮助的是 webRequest 资源类型:https://developer.chrome.com/extensions/webRequest#type-ResourceType

资源类型允许您仅过滤某些类型的请求。例如,'Main_frame' 是在顶层框架中加载的文档。这样,您的 onBeforeRequest 监听器就不会在每次请求图像或样式表时触发。

您可以像按 URL 过滤一样按类型过滤:

chrome.webRequest.onBeforeRequest.addListener(
      function(info) {
        console.log("URL: " + info.url);
        var pageURL = info['url'];
        let mngwlst = new ManageWhitelist();
        var whitelist = mngwlst.getWhitelist();
        if(whitelist == null) mngwlst.setWhitelist([]);
        var denyRequest = false;
        var denyRequest = monitor.ExamineWhitelist(pageURL, whitelist);
        console.log(denyRequest);
        return {cancel: denyRequest}
    },

{ 
    urls: ["<all_urls>"],
    types: ["main_frame"],
},
["blocking"]);

【讨论】:

    【解决方案2】:

    info 有一个名为 type 的属性,它返回 webRequest 的 resourceType。

    这里列出了资源类型:https://developer.chrome.com/extensions/webRequest#type-ResourceType,其中“main_frame”是您要查找的类型。

    chrome.webRequest.onBeforeRequest.addListener(
      function(info) {
        if(info.type == "main_frame"){
            doMyStuff();
            return {cancel: denyRequest};
        }
    },
    {
        urls: [
        "<all_urls>"
        ],
    },
    ["blocking"]);
    

    【讨论】:

    • 虽然正确,但出于性能原因,最好在注册时提供过滤器,而不是在侦听器中过滤。
    猜你喜欢
    • 2016-04-21
    • 2019-06-04
    • 1970-01-01
    • 2012-10-07
    • 2012-01-13
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    相关资源
    最近更新 更多