Wie setze ich ein Header-Feld beim POST eines Formulars?

Antworten:

60

Es kann nicht gemacht werden - AFAIK.

Sie können jedoch beispielsweise jquery verwenden (obwohl Sie dies mit einfachem Javascript tun können), um das Formular zu serialisieren und zu senden (unter Verwendung von AJAX), während Sie Ihren benutzerdefinierten Header hinzufügen.

Schauen Sie sich die Abfrage an, serializedie ein HTML-FORMULAR in form-url-encodedPOST-fähige Werte ändert .

AKTUALISIEREN

Mein Vorschlag ist, entweder aufzunehmen

  • ein verstecktes Formularelement
  • ein Abfragezeichenfolgenparameter
Aliostad
quelle
2
In diesem Fall kann ich Ajax nicht verwenden. Irgendwie bin ich Post und leite auf eine Aspx-Seite weiter. Die Weiterleitung erfolgt per Post.
Reza Owliaei
2
Mein Vorschlag ist, entweder 1) ein verstecktes Formularelement 2) einen
Abfragezeichenfolgenparameter aufzunehmen
1
Können Sie Dateien serialisieren? Ich dachte: Nein.
Fallenreaper
Ja, Sie können Dateien in Base64-Zeichenfolgen serialisieren, was für große Dateien möglicherweise sehr umständlich ist, da Base64 recht umfangreich sein kann. Aber so ist jede Serialisierungsmethode.
Felype
Ich würde es einfach als Abfragezeichenfolgenparameter hinzufügen und Ihren Server überprüfen lassen, ob ein Header oder eine Abfragezeichenfolge vorhanden ist und das Token enthält.
James111
14

Legen Sie einen Cookie-Wert auf der Seite fest und lesen Sie ihn dann auf der Serverseite zurück.

Sie können keinen bestimmten Header festlegen, aber auf den Wert kann im Abschnitt "Header" und nicht im Inhaltskörper zugegriffen werden.

Chris Hynes
quelle
3
Hinweis: Wenn der Header Sie für CSRF - Schutz ist hinzufügen möchten, stellen Sie sicher , dass Sie nicht speichern , dass die Token in einem Cookie, oder Sie werden die CSRF - Schutz besiegen.
Jimothy
5

Aus der FormData- Dokumentation:

XMLHttpRequest Level 2 bietet Unterstützung für die neue FormData-Schnittstelle. FormData-Objekte bieten eine Möglichkeit, auf einfache Weise eine Reihe von Schlüssel / Wert-Paaren zu erstellen, die Formularfelder und deren Werte darstellen, die dann mithilfe der XMLHttpRequest send()Methode einfach gesendet werden können .

Mit einem können XMLHttpRequestSie die benutzerdefinierten Header festlegen und dann das tun POST.

Majid
quelle
2

In der Tat eine bessere Möglichkeit, um ein Cookie auf der Client-Seite zu speichern. Dann wird das Cookie automatisch mit jedem Seitenkopf für diese bestimmte Domain gesendet.

In node-js können Sie Cookies mit dem Cookie-Parser einrichten und verwenden .

ein Beispiel:

res.cookie('token', "xyz....", { httpOnly: true });

Jetzt können Sie darauf zugreifen:

app.get('/',function(req, res){
 var token = req.cookies.token
});

Beachten Sie, dass httpOnly:truesichergestellt ist, dass auf das Cookie normalerweise nicht manuell oder über Javascript zugegriffen werden kann und nur der Browser darauf zugreifen kann. Wenn Sie einige Header oder Sicherheitstoken mit einem Formularbeitrag und nicht über Ajax senden möchten, kann dies in den meisten Fällen als sicherer Weg angesehen werden. Stellen Sie jedoch sicher, dass die Daten über das sichere Protokoll / SSL gesendet werden, wenn Sie vertrauliche benutzerbezogene Informationen speichern, was normalerweise der Fall ist.

Ramesh Pareek
quelle
1

Hier ist was ich in Pub / Jade gemacht habe

extends layout
block content
    script(src="/jquery/dist/jquery.js")
    script.
      function doThePost() {
        var jqXHR = $.ajax({ 
            type:'post'
            , url:<blabla>
            , headers: { 
                'x-custom1': 'blabla'
                , 'x-custom2': 'blabla'
                , 'content-type': 'application/json'
            }
            , data: {
                'id': 123456, blabla
            }
        })
        .done(function(data, status, req) { console.log("done", data, status, req); })
        .fail(function(req, status, err) { console.log("fail", req, status, err); });
      }
    h1= title
    button(onclick='doThePost()') Click
Steve
quelle
0

Sie könnten $ .ajax verwenden, um das natürliche Verhalten von zu vermeiden <form method="POST">. Sie können beispielsweise der Übermittlungsschaltfläche ein Ereignis hinzufügen und die POST-Anforderung als AJAX behandeln.

Fabio Buda
quelle
2
Ich verwende dieses Formular zum Senden , um auf eine Aspx-Seite umzuleiten und einige Daten zu veröffentlichen.
Reza Owliaei
Lass mich besser verstehen: 1) Benutzerbeiträge 2) Speichern von Daten 3) Weiterleiten. Ist es was du tust?
Fabio Buda
Ich habe einen iFrame auf einer HTML-Seite (Quelle), der auf eine andere HTML-Seite (Proxy) verweist. Auf der Proxyseite wird ein Parameter (No Get) über ein Formularelement veröffentlicht. Die Weiterleitung und Veröffentlichung erfolgt auf dem Formular. Ich rufe die auf der aspx-Seite veröffentlichten Parameter als Ziel ab.
Reza Owliaei
0

Um jede Ajax-Anfrage zu ergänzen, habe ich sie hier beantwortet: https://stackoverflow.com/a/58964440/1909708


Um bestimmte Ajax-Anfragen hinzuzufügen, habe ich Folgendes implementiert:

var token_value = $("meta[name='_csrf']").attr("content");
var token_header = $("meta[name='_csrf_header']").attr("content");
$.ajax("some-endpoint.do", {
 method: "POST",
 beforeSend: function(xhr) {
  xhr.setRequestHeader(token_header, token_value);
 },
 data: {form_field: $("#form_field").val()},
 success: doSomethingFunction,
 dataType: "json"
});

Sie müssen die metaElemente in der JSP hinzufügen , z

<html>
<head>        
    <!-- default header name is X-CSRF-TOKEN -->
    <meta name="_csrf_header" content="${_csrf.headerName}"/>
    <meta name="_csrf" content="${_csrf.token}"/>

Um eine Anfrage zum Senden eines Formulars (synchron) hinzuzufügen, habe ich sie hier beantwortet: https://stackoverflow.com/a/58965526/1909708

Himadri Pant
quelle