Javascript Firefox扩展:如何有条件地拦截请求的url并阻止它?

Javascript Firefox扩展:如何有条件地拦截请求的url并阻止它?,javascript,firefox,firefox-addon,firefox-addon-sdk,Javascript,Firefox,Firefox Addon,Firefox Addon Sdk,在我的Firefox扩展中,我想截取浏览器请求的url,如果某些条件匹配,则完全阻止请求 如何截取被请求的URL?您可以查看这些插件的来源 或者将service observer与nsIHTTPChannel配合使用,以实现快速处理 const { Ci, Cu, Cc, Cr } = require('chrome'); //const {interfaces: Ci, utils: Cu, classes: Cc, results: Cr } = Components; Cu.impor

在我的Firefox扩展中,我想截取浏览器请求的url,如果某些条件匹配,则完全阻止请求


如何截取被请求的URL?

您可以查看这些插件的来源

或者将service observer与
nsIHTTPChannel
配合使用,以实现快速处理

const { Ci, Cu, Cc, Cr } = require('chrome'); //const {interfaces: Ci, utils: Cu, classes: Cc, results: Cr } = Components;
Cu.import('resource://gre/modules/Services.jsm');
Cu.import('resource://gre/modules/devtools/Console.jsm');

var observers = {
    'http-on-modify-request': {
        observe: function (aSubject, aTopic, aData) {
            console.info('http-on-modify-request: aSubject = ' + aSubject + ' | aTopic = ' + aTopic + ' | aData = ' + aData);
            var httpChannel = aSubject.QueryInterface(Ci.nsIHttpChannel);
            var requestUrl = httpChannel.URI.spec
            if (requestUrl.indexOf('google.com') > -1) {
               //httpChannel.cancel(Cr.NS_BINDING_ABORTED); //this aborts the load
               httpChannel.redirectTo(Services.io.newURI('data:text,url_blocked', null, null)); //can redirect with this line, if dont want to redirect and just block, then uncomment this line and comment out line above (line 17)
            }
        },
        reg: function () {
            Services.obs.addObserver(observers['http-on-modify-request'], 'http-on-modify-request', false);
        },
        unreg: function () {
            Services.obs.removeObserver(observers['http-on-modify-request'], 'http-on-modify-request');
        }
    }
};
开始观察 要开始观察所有请求,请执行此操作(例如,在启动加载项时)

停止观察 停止观察非常重要(请确保至少在插件关闭时运行此操作,因为内存原因,您不想让观察者注册)

阻止/重定向URL的observer服务的完整工作示例:

其他可能的解决方案:

下面是来自HTTPS Everywhere的另一个模块实现示例

初始化函数:

  init: function() {
    // start observing all http requests
    Services.obs.addObserver(httpNowhere, "http-on-modify-request", false);
  },
observe: function(subject, topic, data) {
var request = subject.QueryInterface(Ci.nsIHttpChannel);
  if (topic == "http-on-modify-request") {
    if (request.URI.spec == "xxx.example.com") {
      request.redirectTo("yyy.example.com");
    }
    else {
      request.cancel(Components.results.NS_ERROR_ABORT);
    }
  }
},
观察员职能:

  init: function() {
    // start observing all http requests
    Services.obs.addObserver(httpNowhere, "http-on-modify-request", false);
  },
observe: function(subject, topic, data) {
var request = subject.QueryInterface(Ci.nsIHttpChannel);
  if (topic == "http-on-modify-request") {
    if (request.URI.spec == "xxx.example.com") {
      request.redirectTo("yyy.example.com");
    }
    else {
      request.cancel(Components.results.NS_ERROR_ABORT);
    }
  }
},
示例插件:

无处可去

HTTPS无处不在-

将扩展迁移到chrome:

我在本页中回答了您关于chrome的问题:

我认为最好的选择是nsIContentPolicy,但您也可以使用observer服务:谢谢,我用
cxf init
创建了一个基本插件,并用
bootstrap.js
替换了
main.js
,我明白了,我对Firefox版本
38.0.1
和addon sdk版本
1.17
非常陌生,但是
无法在当前目录或任何父目录中找到“package.json”。
由于此错误而失败,因此我刚刚创建了此基本模板,并将您的bootstrap.js添加到main.js,如何将这些内容连接在一起,谢谢firefox调试器应该对调试您的加载项以打开它很有用(ctrl+shift+j)此外,您还必须启用加载项的调试您可以轻松地使用我想我不了解加载项的入口点,是的,我安装了调试器,但它从未进入您的startup()方法,在该方法中重新启动所有的observer。如果不接受两个答案,请将其发布在此处