Como definir um campo de cabeçalho no POST de um formulário?

Respostas:

60

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 serializeque muda um FORM HTML em form-url-encodedvalores prontos para POST.

ATUALIZAR

Minha sugestão é incluir

  • um elemento de formulário oculto
  • um parâmetro de string de consulta
Aliostad
fonte
2
Não posso usar ajax neste caso. De alguma forma, estou postar e redirecionar para uma página aspx. O redirecionamento é feito pelo From Post.
Reza Owliaei
2
Minha sugestão é incluir 1) um elemento de formulário oculto 2) um parâmetro de string de consulta
Aliostad
1
Você pode serializar arquivos? Eu pensei: Não.
Fallenreaper 01 de
Sim, você pode serializar arquivos em strings Base64, talvez muito desajeitado para arquivos grandes, já que Base64 pode ser bastante volumoso. Mas todo método de serialização também.
Felype
Eu apenas o adicionaria como um parâmetro de string de consulta e faria seu servidor verificar se um cabeçalho ou string de consulta existe e tem o token.
James111
14

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.

Chris Hynes
fonte
3
Nota: Se o cabeçalho que você deseja adicionar for para proteção CSRF, certifique-se de não armazenar esse token em um cookie, ou você invalidará a proteção CSRF.
Jimothy
5

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, XMLHttpRequestvocê pode definir os cabeçalhos personalizados e depois fazer o POST.

Majid
fonte
2

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:truegarante 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.

Ramesh Pareek
fonte
1

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
Steve
fonte
0

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.

Fabio Buda
fonte
2
Eu uso este formulário para redirecionar para uma página aspx e postar alguns dados.
Reza Owliaei
me fazer entender melhor: 1) postagens de usuários 2) salvando dados 3) redirecionar. É o que você faz?
Fabio Buda,
Tenho um iFrame em uma página Html (Fonte), apontando para outra página html (Proxy). A página proxy postar algum parâmetro (No Get) por meio de um elemento de formulário. O redirecionamento e a postagem acontecem no envio do formulário. Eu recupero os parâmetros postados na página aspx como destino.
Reza Owliaei
0

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 metaelementos 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

Himadri Pant
fonte