如何拦截XMLHttpRequest和更改请求URL

时间:2018-10-26 08:47:35

标签: javascript node.js

我的前台将请求发送到后台服务器。如何拦截此请求,然后重定向回另一个请求?如何更改后退的URL?

  const intercept = (urlmatch, callback) => {
  let send = XMLHttpRequest.prototype.send;
  XMLHttpRequest.prototype.send = function() {
    this.addEventListener('readystatechange', function() {
      if (this.responseURL.includes(urlmatch) && this.readyState === 4) {
        callback(this);
      }
    }, false);
    send.apply(this, arguments);
  };
};

谢谢!

1 个答案:

答案 0 :(得分:2)

这可以通过修补XMLHttpRequest open来轻松实现:

const intercept = (urlmatch, newurl) => {
  const open = XMLHttpRequest.prototype.open;
  XMLHttpRequest.prototype.open = function (method, url, ...rest) {
    url = url.replace(urlmatch, newurl);
    return open.call(this, method, url, ...rest);
  };
}

intercept('http:/example.com/', 'http:/my-example.com/');

为满足当地需求而修改全局变量是一种不良做法,可能会导致无法预料的后果。

除非目标是篡改其他人的应用程序(例如,使用用户脚本),否则更干净的方法是修改应用程序以使其可以更改基本url,例如来自

makeRequest('http:/example.com/api/...')

makeRequest(BASE_API_URL + '...')

BASE_API_URL是应用程序常量,可以在应用程序初始化时使用环境变量,全局变量,依赖项注入等进行更改。

如果应用程序直接使用某种包装而不是XMLHttpRequest,则基本URL功能可以在包装中实现。