Como posso definir um campo personalizado no cabeçalho POST ao enviar um formulário?
Como posso definir um campo personalizado no cabeçalho POST ao enviar um formulário?
Respostas:
Isso não pode ser feito - AFAIK.
No entanto, você pode usar por exemplo jquery (embora possa fazê-lo com javascript simples) para serializar o formulário e enviar (usando AJAX) enquanto adiciona seu cabeçalho personalizado.
Veja o jquery serialize
que muda um FORM HTML em form-url-encoded
valores prontos para POST.
Minha sugestão é incluir
Defina um valor de cookie na página e leia-o no lado do servidor.
Você não poderá definir um cabeçalho específico, mas o valor estará acessível na seção de cabeçalhos e não no corpo do conteúdo.
Da documentação FormData :
XMLHttpRequest Nível 2 adiciona suporte para a nova interface FormData. Os objetos FormData fornecem uma maneira de construir facilmente um conjunto de pares chave / valor representando campos de formulário e seus valores, que podem então ser facilmente enviados usando o
XMLHttpRequest
send()
método.
Com um, XMLHttpRequest
você pode definir os cabeçalhos personalizados e depois fazer o POST
.
Na verdade, a melhor maneira de fazer isso é salvar um cookie no lado do cliente. Em seguida, o cookie é enviado automaticamente com cada cabeçalho de página desse domínio específico.
No node-js, você pode configurar e usar cookies com o analisador de cookies .
um exemplo:
res.cookie('token', "xyz....", { httpOnly: true });
Agora você pode acessar:
app.get('/',function(req, res){
var token = req.cookies.token
});
Observe que isso httpOnly:true
garante que o cookie geralmente não seja acessível manualmente ou por meio de javascript e apenas o navegador pode acessá-lo. Se você deseja enviar alguns cabeçalhos ou tokens de segurança com uma postagem de formulário, e não por meio de ajax, na maioria das situações isso pode ser considerado uma forma segura. No entanto, certifique-se de que os dados sejam enviados por protocolo / ssl seguro se você estiver armazenando alguma informação relacionada ao usuário sensível, o que geralmente é o caso.
Aqui está o que eu fiz no 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 você estiver usando JQuery com o plugin Form, você pode usar:
$('#myForm').ajaxSubmit({
headers: {
"foo": "bar"
}
});
Você pode usar $ .ajax para evitar o comportamento natural de <form method="POST">
. Você poderia, por exemplo, adicionar um evento ao botão de envio e tratar a solicitação POST como AJAX.
Para adicionar em cada solicitação ajax, respondi aqui: https://stackoverflow.com/a/58964440/1909708
Para adicionar em solicitações Ajax específicas, veja como implementei:
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"
});
Você deve adicionar os meta
elementos no JSP, por exemplo
<html>
<head>
<!-- default header name is X-CSRF-TOKEN -->
<meta name="_csrf_header" content="${_csrf.headerName}"/>
<meta name="_csrf" content="${_csrf.token}"/>
Para adicionar a uma solicitação de envio de formulário (síncrono), respondi aqui: https://stackoverflow.com/a/58965526/1909708
XmlHttpRequest
você quer dizer? Ou apenas uma postagem de FORMULÁRIO em HTML simples?