javascript - 跟踪 JavaScript 中 URL 的重定向路径

标签 javascript redirect firefox-addon

我正在尝试查找浏览器中请求的 url 的重定向次数,如果可能的话,我想通过 javascript 跟踪该 URL 的重定向路径。

例如,如果我在浏览器中请求“A”。假设重定向流程为 A->B->C->D。意思是,它被重定向到“D”。在这种情况下,我需要获得三个 301 重定向状态代码和一个 200 ok 状态代码。

我在我的 addon.js 中尝试了以下方法(并为 firefox 浏览器制作了一个插件)。

var req = new XMLHttpRequest();
req.open('GET', document.location, false);
req.send(null);
var headers = req.getAllResponseHeaders().toLowerCase();
var StatusValue = req.status;

它给出 200 ok(我认为它是最终 url)。

是否可以通过 Javascript 获取 URL 的所有 301 重定向。

谢谢,

最佳答案

nsIXMLHttpRequest interface有一个类型为 nsIChannel 的成员 channel(只能由扩展程序访问) .您可以将自己的回调分配给它的 notificationCallbacks 属性并实现 nsIChannelEventSync interface接收重定向事件。沿着这些线的东西:

Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");

var req = new XMLHttpRequest();
req.open('GET', document.location);

var oldNotifications = req.channel.notificationCallbacks;
var oldEventSink = null;
req.channel.notificationCallbacks =
{
  QueryInterface: XPCOMUtils.generateQI([
      Components.interfaces.nsIInterfaceRequestor,
      Components.interfaces.nsIChannelEventSink]),

  getInterface: function(iid)
  {
    // We are only interested in nsIChannelEventSink, return the old callbacks
    // for any other interface requests.
    if (iid.equals(Ci.nsIChannelEventSink))
    {
      try {
        oldEventSink = oldNotifications.QueryInterface(iid);
      } catch(e) {}
      return this;
    }

    if (oldNotifications)
      return oldNotifications.QueryInterface(iid);
    else
      throw Components.results.NS_ERROR_NO_INTERFACE;
  },

  asyncOnChannelRedirect: function(oldChannel, newChannel, flags, callback)
  {
    var type = null;
    if (flags & Components.interfaces.nsIChannelEventSink.REDIRECT_TEMPORARY)
      type = "temporary";
    else if (flags & Components.interfaces.nsIChannelEventSink.REDIRECT_PERMANENT)
      type = "permanent";
    else if (flags & Components.interfaces.nsIChannelEventSink.REDIRECT_INTERNAL)
      type = "internal";

    Components.utils.reportError("Redirect from " + oldChannel.URI.spec + " " +
                                 "to " + newChannel.URI.spec + " " +
                                 (type ? "(" + type + ")" : ""));

    if (oldEventSink)
      oldEventSink.asyncOnChannelRedirect(oldChannel, newChannel, flags, callback);
    else
      callback.onRedirectVerifyCallback(Cr.NS_OK);
  }
};

req.send(null);

此代码确保在记录对 nsIChannelEventSync.asyncOnChannelRedirect 的任何调用时始终调用旧的通知回调。

供引用:nsIInterfaceRequestor , XPCOMUtils .

关于javascript - 跟踪 JavaScript 中 URL 的重定向路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11206967/

相关文章:

JavaScript 重定向在 Facebook 应用内浏览器中不起作用

javascript - 重定向到随机页面(当前页面除外)

c# - 如何从重定向的网址下载文件?

javascript - 加载新页面时快速重定向选项卡的方法

firefox-addon - 使用 JetBrains WebStorm 的 Firefox 插件开发。如何处理大量警告?

javascript - 为什么打开页面时不显示 Google map

javascript - 创建高度以百分比定义的可滚动内容区域时出现问题

javascript - Mongoose 错误: The `uri` parameter to `openUri()` must be a string

javascript - window.onerror 在我的 Firefox 附加组件(page-mod API)中不会触发

javascript - 需要 Reactjs 帮助来了解如何正确地将这个函数从父按钮组件传递到子按钮组件