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.