Melacak jalur pengalihan URL dalam javascript

Saya mencoba menemukan jumlah pengalihan url yang diminta di browser, dan jika mungkin ingin melacak jalur pengalihan URL tersebut melalui javascript.

Misalnya, jika saya meminta 'A' di browser saya. Asumsikan aliran pengalihan sebagai A->B->C->D. Artinya, itu dialihkan ke 'D'. Dalam hal ini saya perlu mendapatkan tiga kode status pengalihan 301 dan satu kode status 200 ok.

Saya mencoba metode di bawah ini di addon.js saya (dan membuat addon ke browser firefox).

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

Itu memberi 200 ok (saya pikir itu dari url final).

Apakah mungkin untuk mendapatkan semua 301 pengalihan URL melalui Javascript.

Terima kasih,


person Mmh    schedule 26.06.2012    source sumber
comment
pertanyaan yang menarik. naluri saya adalah mengatakan bahwa Anda perlu membuat/memperbarui cookie atau variabel sesi di setiap tautan dalam rantai pengalihan, karena setiap pengalihan merupakan permintaan baru, dan oleh karena itu merupakan respons baru.   -  person jackwanders    schedule 26.06.2012
comment
comment
dapatkah Anda menjelaskan secara singkat, cara menangkap setiap tautan dalam rantai yang dialihkan. karena saya mendapatkan konten situs web yang dialihkan (yang terakhir dalam rantai pengalihan) di browser saya. Dan 200 status ok untuk itu. Terima kasih,   -  person Mmh    schedule 27.06.2012


Jawaban (2)


nsIXMLHttpRequest antarmuka memiliki anggota channel (hanya dapat diakses oleh ekstensi) jenis nsIChannel. Anda dapat menetapkan callback Anda sendiri ke properti notificationCallbacks dan mengimplementasikan nsIChannelEventSync antarmuka untuk menerima peristiwa pengalihan. Sesuatu seperti ini:

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);

Kode ini memastikan untuk selalu memanggil panggilan balik notifikasi lama saat mencatat panggilan apa pun ke nsIChannelEventSync.asyncOnChannelRedirect.

Untuk referensi: nsIInterfaceRequestor, XPCOMUtils.

person Wladimir Palant    schedule 28.06.2012
comment
Hebat! Saya hanya membutuhkan ini! Terima kasih! Apakah ada cara untuk memblokir pengalihan? (mungkin saya akan mulai menyelidiki sekarang, hanya bermalas-malasan dan bertanya sebelum saya mulai) Apakah mungkin juga melakukan hal seperti ini dari ChromeWorker? - person Noitidart; 18.09.2016
comment
@Noitidart: Ya, Anda tidak harus meneruskan NS_OK ke panggilan balik, Anda juga dapat memberikan is NS_BINDING_ABORTED misalnya. ChromeWorker tidak berfungsi, tidak dapat mengakses XPCOM. - person Wladimir Palant; 18.09.2016
comment
Terima kasih! Seharusnya melakukan callback.onRedirectVerifyCallback(Components.results.NS_BINDING_ABORTED) berbeda dari apa yang dilakukannya saat kita throw seperti yang disebutkan di halaman DXR - dxr.mozilla.org/mozilla-central/source/netwerk/base/ ? Bertanya karena saya mungkin telah mengacaukan sesuatu haha - person Noitidart; 18.09.2016
comment
@Noitidart: Tidak juga, seharusnya melakukan hal yang sama. Namun, sebagian besar kode kesalahan akan muncul di Konsol Kesalahan, namun NS_BIND‌​ING_ABORTED tidak. - person Wladimir Palant; 18.09.2016
comment
Terima kasih @Palant Saya pikir mengapa saya melakukan logging adalah saya tidak melakukan throw Cr.NS_BINDING_ABORTED tetapi saya melakukan throw new Error(Cr.NS_BINDING_ABORTED). Saya akan mencobanya sekarang. Tidak peduli apa dalam pengujian saya ketika saya melakukan callback.onRedirectVerifyCallback dengan Cr.NS_BINDING_ABORTED itu berakhir dengan fatal. Jadi acaranya tidak lagi aktif sehingga pendengar acara pemuatan saya tidak terjadi. Berbeda jika saya melempar. Jadi inilah yang terjadi dengan panggilan balik - "NS_BINDING_ABORTED: Component returned failure code: 0x804b0002 (NS_BINDING_ABORTED) [nsIAsyncVerifyRedirectCallback.onRedirectVerifyCallback" - person Noitidart; 18.09.2016
comment
Anehnya jadi throw Cr.NS_BINDING_ABORTED dimasukkan ke konsol uncaught exception: 2152398850 (unknown), sementara yang dilakukan throw new Error(Cr.NS_BINDING_ABORTED dimasukkan ke konsol Error: 2152398850 bootrap.js:1990:5. Eh mungkin itu preferensi pengembang saya. Aku akan berhenti rewel haha. - person Noitidart; 18.09.2016

terima kasih, kodenya berfungsi, tetapi tidak seperti yang diharapkan: A->B->C->D (channel_1 -> channel_2 -> channel_3 -> channel_4).

Dalam kasus saya ini akan mencatat rantai pengalihan A->B->C->D seperti:

A->B (channel_1 -> channel_2), than B->C (channel_1 -> channel_2), C->D (channel_1 -> channel_2); dimana channel_1 & channel_2 adalah nomor hash acak.

Jadi saya tidak bisa menghubungkan rantai itu bersama-sama. itu akan menjadi strategi untuk menangkap rangkaian peristiwa (sementara halaman dialihkan menggunakan, penyegaran meta, javascript, http...)?

person Martin    schedule 19.01.2018