¿Cómo configurar un campo de encabezado en POST un formulario?


96

¿Cómo puedo configurar un campo personalizado en el encabezado POST al enviar un formulario?


1
¿Usando XmlHttpRequestquieres decir? ¿O simplemente una publicación en formato HTML simple?
Aliostad

no, estoy usando la acción de formulario: publicación
Reza Owliaei

Respuestas:


60

No se puede hacer - AFAIK.

Sin embargo, puede usar, por ejemplo, jquery (aunque puede hacerlo con javascript simple) para serializar el formulario y enviarlo (usando AJAX) mientras agrega su encabezado personalizado.

Mire el jquery serializeque cambia un FORMATO HTML en form-url-encodedvalores listos para POST.

ACTUALIZAR

Mi sugerencia es incluir

  • un elemento de formulario oculto
  • un parámetro de cadena de consulta

2
No puedo usar ajax en este caso. De alguna manera, soy Publicar y redireccionar a una página aspx. La redirección se realiza desde la publicación.
Reza Owliaei

2
Mi sugerencia es incluir 1) un elemento de formulario oculto 2) un parámetro de cadena de consulta
Aliostad

1
¿Puedes serializar archivos? Pensé: No.
Fallenreaper

Sí, puede serializar archivos en cadenas Base64, quizás muy torpe para archivos grandes, ya que Base64 puede ser bastante voluminoso. Pero también lo son todos los métodos de serialización.
Felype

Simplemente lo agregaría como un parámetro de cadena de consulta y haría que su servidor verificara si existe un encabezado o cadena de consulta y tiene el token.
James111

14

Establezca un valor de cookie en la página y luego léalo del lado del servidor.

No podrá establecer un encabezado específico, pero se podrá acceder al valor en la sección de encabezados y no en el cuerpo del contenido.


3
Nota: Si el encabezado que desea agregar es para protección CSRF, asegúrese de no almacenar ese token en una cookie, o anulará la protección CSRF.
Jimothy

5

Desde la documentación de FormData :

XMLHttpRequest Level 2 agrega soporte para la nueva interfaz FormData. Los objetos FormData proporcionan una forma de construir fácilmente un conjunto de pares clave / valor que representan campos de formulario y sus valores, que luego se pueden enviar fácilmente mediante el XMLHttpRequest send()método.

Con un XMLHttpRequestpuede configurar los encabezados personalizados y luego hacer el POST.


2

De hecho, una mejor manera de hacerlo es guardar una cookie en el lado del cliente. Luego, la cookie se envía automáticamente con cada encabezado de página para ese dominio en particular.

En node-js, puede configurar y usar cookies con el analizador de cookies .

un ejemplo:

res.cookie('token', "xyz....", { httpOnly: true });

Ahora puedes acceder a esto:

app.get('/',function(req, res){
 var token = req.cookies.token
});

Tenga en cuenta que httpOnly:truegarantiza que la cookie no sea generalmente accesible de forma manual o mediante javascript y que solo el navegador pueda acceder a ella. Si desea enviar algunos encabezados o tokens de seguridad con una publicación de formulario, y no a través de ajax, en la mayoría de las situaciones, esto puede considerarse una forma segura. Aunque asegúrese de que los datos se envíen a través de un protocolo seguro / ssl si está almacenando información confidencial relacionada con el usuario, que suele ser el caso.


1

Esto es lo que hice en 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

Puede usar $ .ajax para evitar el comportamiento natural de <form method="POST">. Podría, por ejemplo, agregar un evento al botón de envío y tratar la solicitud POST como AJAX.


2
Utilizo este envío de formulario para redirigir a una página aspx y publicar algunos datos.
Reza Owliaei

hazme entender mejor: 1) publicaciones de usuarios 2) guardar datos 3) redireccionar. Es lo que haces?
Fabio Buda

Tengo un iFrame en una página Html (Fuente), apuntando a otra página html (Proxy). La página de proxy publica algún parámetro (No Get) a través de un elemento de formulario. La redirección y la publicación se realizan al enviar el formulario. Recupero los parámetros publicados en la página aspx como destino.
Reza Owliaei

0

Para agregar a cada solicitud de ajax, la he respondido aquí: https://stackoverflow.com/a/58964440/1909708


Para agregar en solicitudes particulares de ajax, así es como implementé:

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"
});

Debe agregar los metaelementos en la JSP, por ejemplo

<html>
<head>        
    <!-- default header name is X-CSRF-TOKEN -->
    <meta name="_csrf_header" content="${_csrf.headerName}"/>
    <meta name="_csrf" content="${_csrf.token}"/>

Para agregar a una solicitud de envío de formulario (sincrónico), la he respondido aquí: https://stackoverflow.com/a/58965526/1909708

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.