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

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.


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.


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.


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


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.