it-swarm.com.de

Gibt es eine Möglichkeit, Ajax-Header zu entfernen, die mit setRequestHeader () festgelegt wurden?

Ich schreibe ein JS-Skript, das sich in einem System befindet, das jetzt über jqXHR.setRequestHeader () in einer bei jQuery.ajaxPrefilter () registrierten Funktion einen benutzerdefinierten XID-Header zu allen Ajax-Anforderungen hinzufügt.

In meinem Skript muss ich eine Ajax-Anfrage an eine Drittanbieter-Site senden, deren Zugriffskontroll-Zulassen-Header nicht so konfiguriert sind, dass dieser benutzerdefinierte XID-Header zulässig ist.

Es scheint, ich habe 3 Möglichkeiten:

  1. Finden Sie eine Möglichkeit, den XID-Header in der BeforeSend-Funktion von $ .ajax () zu entfernen, die nach der Funktion ajaxPrefilter () aufgerufen wird.
  2. Verzichten Sie ganz auf die Verwendung von $ .ajax () und schreiben Sie das Ajax-Zeug einfach selbst.
  3. Lassen Sie $ .ajax () auf das Backend des Systems zeigen, das den benutzerdefinierten XID-Header akzeptiert, und führen Sie die Anforderung über cURL an die Site eines Drittanbieters aus.

Option 1 wird bevorzugt, wenn es eine einfache Möglichkeit gibt, da dies die sauberste und schnellste Route ist. Kann einfach nicht herausfinden wie .

Ich habe versucht, es so zu überschreiben, aber es hat nicht funktioniert:

beforeSend: function(jqXHR, settings) {
    jqXHR.setRequestHeader('custom-xid-header', null);
}

Irgendwelche Ideen?

17
Brandon Kelly

Mir ist klar, dass dies ein alter Thread ist, aber es ist immer noch ein Problem! Ich hoffe, das Folgende hilft, es für jemanden anders zu lösen, als für uns.

Wenn Sie einen Header auf null/undefined/"" setzen, nachdem er gesetzt wurde, wird nicht entfernt. Der Header wird immer noch gesendet, jedoch ohne Wert oder "undefined" oder "null". Dies ist wahrscheinlich nie das, was Sie wollen, und in unserem Fall wird SSO vollständig zerstört, wenn es sich um den Autorisierungsheader handelt.

Die von uns vorgestellte Lösung beruht auf einer Mischung aus @ Marlars Vorschlag (Danke) und einem weiteren Mangel an jQuery: Sie können nur einen ONE beforeSend()-Hook haben und jeden neuen Haken ersetzen den vorherigen. Es scheint, dass dies auch zutreffend ist, wenn Sie eine beforeSend() in einer bestimmten $.ajax()-Anforderung angeben. Die Standardanforderung in $.ajaxSetup() wird überschrieben. Auf diese Weise verhindern Sie, dass der Standardhaken den Header setzt. (Es ist nicht 100% ig ideal, da in der Standardeinstellung beforeSend() möglicherweise andere Dinge ausgeführt werden, die dann nicht passieren, aber hey).

Dies bewältigt sowohl statische als auch dynamisch gesetzte Header für eine bestimmte Anforderung:

if($.ajaxSettings && $.ajaxSettings.headers) {
    delete $.ajaxSettings.headers.Authorization;
}
$.ajax({
    beforeSend: function() {}, // no op
    // ...
});

Sie können nicht dasselbe für prefilter() tun, aber ich denke, beforeSend() ist der weitaus üblichere Weg, dies trotzdem zu tun.

4
randomsock
$.ajaxSetup({
    beforeSend: function(jqXHR, settings) {
        jqXHR.setRequestHeader('custom-xid-header', null);
    }
})

siehe http://api.jquery.com/jQuery.ajaxSetup/

2
Gerald Chen

Header können nicht mit beforeSend() gelöscht werden, da die bereits an XMLHttpRequest übergebenen Daten nur die Header ändern können.

Aber heute, 2019, können Sie unerwünschte (nicht standardmäßige) Header mit jQuery.ajaxPrefilter() löschen.

$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
  delete options.headers['custom-xid-header'];
});

$.ajax({
  url: '//httpbin.org/get',
  headers: {
    'custom-xid-header': 'remove me',
    "Accept": "what/ever"
  },
  datatype: 'json',
  success: function(data) {
    console.log(data.headers);
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<!--script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script-->
1
ewwink

Dadurch wird eine Kopfzeile mit $ .ajaxSetup () entfernt. Ich denke, es wird auch mit beforeSend () funktionieren.

delete $.ajaxSettings.headers["custom-xid-header"]
0
marlar

Overiding scheint nicht zu funktionieren, aber es gibt eine einfache Lösung.

 $.ajaxSetup({
        beforeSend: function (jqXHR) {
            if (sendToken == true)
                jqXHR.setRequestHeader("Authorization", cookie);
            return true;
        }
    });

Überprüfen Sie die Variable sendToken . Es ist global. Zu Beginn meiner App habe ich es immer auf true gesetzt, weil ich den Headerset ziemlich überall brauche.

Wenn ich jedoch den Header "Authorization" nicht senden möchte, übergebe ich nur das globale sendToken an false , bevor eine Anfrage ausgeführt werden kann. Wenn alle Anfragen erledigt sind, setze ich sie einfach auf true again ...

Der Trick ist, dass die Variable jqXHR lokal ist und den zugewiesenen Wert nicht jedes Mal beibehält. Das Überschreiben eines aktuellen Werts im ajaxSetup funktioniert nicht, da er immer den neuen Wert hinzufügt, anstatt ihn nur zu ersetzen. Eine Bedingung zu haben ist meiner Meinung nach der einfachste und effizienteste Weg.

Es hat für mich funktioniert.

0
Doctor