Как установить поле заголовка в форме POST?

99

Как я могу установить настраиваемое поле в заголовке POST при отправке формы?

Реза Овляи
источник
1
Использование XmlHttpRequestвы имеете в виду? Или просто сообщение в формате HTML?
Aliostad 01
нет, я использую действие формы: сообщение
Реза Овляй 01
возможное дублирование заголовков пользовательских HTTP-запросов в HTML
Джеймс Дринкард

Ответы:

61

Это невозможно сделать - AFAIK.

Однако вы можете использовать, например, jquery (хотя вы можете сделать это с помощью простого javascript) для сериализации формы и отправки (с использованием AJAX) при добавлении собственного заголовка.

Посмотрите на jquery, serializeкоторый изменяет HTML-ФОРМУ на form-url-encodedзначения, готовые для POST.

ОБНОВИТЬ

Я предлагаю включить либо

  • скрытый элемент формы
  • параметр строки запроса
Алиостад
источник
2
В этом случае я не могу использовать ajax. Как-то я отправляю и перенаправляю на страницу aspx. Перенаправление осуществляется из сообщения.
Reza Owliaei 01
2
Я предлагаю включить либо 1) скрытый элемент формы, 2) параметр строки запроса
Aliostad 01
1
Можете ли вы сериализовать файлы? Я подумал: Нет.
Fallenreaper
Да, вы можете сериализовать файлы в строки Base64, возможно, очень неуклюже для больших файлов, поскольку Base64 может быть довольно громоздким. Но то же самое с каждым методом сериализации.
Felype
Я бы просто добавил его как параметр строки запроса, и ваш сервер проверил, существует ли заголовок или строка запроса и есть ли токен.
James111,
14

Установите значение cookie на странице, а затем прочтите его на стороне сервера.

Вы не сможете установить конкретный заголовок, но значение будет доступно в разделе заголовков, а не в теле содержимого.

Крис Хайнс
источник
3
Примечание. Если заголовок, который вы хотите добавить, предназначен для защиты CSRF, убедитесь, что вы не сохранили этот токен в файле cookie, иначе вы обойдете защиту CSRF.
Jimothy 09
5

Из документа FormData :

XMLHttpRequest Level 2 добавляет поддержку нового интерфейса FormData. Объекты FormData предоставляют способ легко создать набор пар ключ / значение, представляющих поля формы и их значения, которые затем можно легко отправить с помощью этого XMLHttpRequest send()метода.

С помощью XMLHttpRequestвы можете установить пользовательские заголовки, а затем сделать POST.

Маджид
источник
2

Фактически, лучший способ сделать это - сохранить куки на стороне клиента. Затем файл cookie автоматически отправляется с каждым заголовком страницы для этого конкретного домена.

В node-js вы можете настроить и использовать файлы cookie с помощью cookie-parser .

пример:

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

Теперь вы можете получить доступ к этому:

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

Обратите внимание, что это httpOnly:trueгарантирует, что файл cookie обычно недоступен вручную или через javascript, и только браузер может получить к нему доступ. Если вы хотите отправить некоторые заголовки или токены безопасности в форме сообщения, а не через ajax, в большинстве случаев это можно считать безопасным способом. Хотя убедитесь, что данные отправляются по безопасному протоколу / ssl, если вы храните конфиденциальную информацию, связанную с пользователем, что обычно имеет место.

Рамеш Парик
источник
1

Вот что я сделал в пабе / нефрите

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

Вы можете использовать $ .ajax, чтобы избежать естественного поведения <form method="POST">. Вы можете, например, добавить событие к кнопке отправки и обрабатывать запрос POST как AJAX.

Фабио Буда
источник
2
Я использую эту форму отправки для перенаправления на страницу aspx и публикации некоторых данных.
Reza Owliaei 01
заставьте меня лучше понять: 1) сообщения пользователей 2) сохранение данных 3) перенаправление. Это то, чем ты занимаешься?
Фабио Буда
У меня iFrame на странице Html (источник), указывающий на другую страницу html (прокси). Прокси-страница публикует некоторый параметр (No Get) через элемент формы. Перенаправление и публикация происходит при отправке формы. Я получаю опубликованные параметры на странице aspx в качестве пункта назначения.
Reza Owliaei 01
0

Чтобы добавить в каждый запрос ajax, я ответил на него здесь: https://stackoverflow.com/a/58964440/1909708


Чтобы добавить в конкретные запросы ajax, вот как я реализовал:

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

Вы должны добавить metaэлементы в JSP, например

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

Чтобы добавить в запрос на отправку формы (синхронный), я ответил на него здесь: https://stackoverflow.com/a/58965526/1909708

Химадри брюки
источник