Come posso impostare un campo personalizzato nell'intestazione POST durante l'invio di un modulo?
Come posso impostare un campo personalizzato nell'intestazione POST durante l'invio di un modulo?
Risposte:
Non si può fare - AFAIK.
Tuttavia puoi usare ad esempio jquery (sebbene tu possa farlo con semplice javascript) per serializzare il modulo e inviarlo (usando AJAX) mentre aggiungi la tua intestazione personalizzata.
Guarda il jquery serialize
che cambia un FORM HTML in form-url-encoded
valori pronti per il POST.
Il mio suggerimento è di includere entrambi
Imposta un valore per il cookie sulla pagina, quindi leggilo sul lato server.
Non sarai in grado di impostare un'intestazione specifica, ma il valore sarà accessibile nella sezione delle intestazioni e non nel corpo del contenuto.
Dalla documentazione di FormData :
XMLHttpRequest Livello 2 aggiunge il supporto per la nuova interfaccia FormData. Gli oggetti FormData forniscono un modo per costruire facilmente un set di coppie chiave / valore che rappresentano i campi del modulo ei loro valori, che possono quindi essere facilmente inviati utilizzando il
XMLHttpRequest
send()
metodo.
Con un XMLHttpRequest
è possibile impostare le intestazioni personalizzate e quindi eseguire il POST
.
In effetti, un modo migliore per farlo è salvare un cookie sul lato client. Quindi il cookie viene inviato automaticamente con ogni intestazione di pagina per quel particolare dominio.
In node-js, puoi impostare e utilizzare i cookie con cookie-parser .
un esempio:
res.cookie('token', "xyz....", { httpOnly: true });
Ora puoi accedere a questo:
app.get('/',function(req, res){
var token = req.cookies.token
});
Si noti che httpOnly:true
garantisce che il cookie di solito non è accessibile manualmente o tramite javascript e solo il browser può accedervi. Se vuoi inviare alcune intestazioni o token di sicurezza con un modulo post, e non tramite ajax, nella maggior parte delle situazioni questo può essere considerato un modo sicuro. Anche se assicurati che i dati vengano inviati tramite protocollo sicuro / ssl se stai memorizzando alcune informazioni sensibili relative agli utenti, come di solito è il caso.
Ecco cosa ho fatto in pub / jade
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
Se stai usando JQuery con il plugin Form, puoi usare:
$('#myForm').ajaxSubmit({
headers: {
"foo": "bar"
}
});
Puoi usare $ .ajax per evitare il comportamento naturale di <form method="POST">
. Ad esempio, potresti aggiungere un evento al pulsante di invio e trattare la richiesta POST come AJAX.
Per aggiungere a ogni richiesta ajax, ho risposto qui: https://stackoverflow.com/a/58964440/1909708
Per aggiungere in particolari richieste ajax, ecco come ho implementato:
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"
});
È necessario aggiungere gli meta
elementi nel JSP, ad es
<html>
<head>
<!-- default header name is X-CSRF-TOKEN -->
<meta name="_csrf_header" content="${_csrf.headerName}"/>
<meta name="_csrf" content="${_csrf.token}"/>
Per aggiungere a una richiesta di invio del modulo (sincrona), ho risposto qui: https://stackoverflow.com/a/58965526/1909708
XmlHttpRequest
intendi? O solo un semplice messaggio in formato HTML?