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


95

Як я можу встановити спеціальне поле у ​​заголовку POST після подання форми?


1
Використовуючи XmlHttpRequestви маєте на увазі? Або просто звичайний пост у форматі HTML?
Аліостад

ні, я використовую форму дії: повідомлення
Reza Owliaei

Відповіді:


60

Це неможливо зробити - AFAIK.

Однак ви можете використовувати, наприклад, jquery (хоча ви можете це робити за допомогою простого javascript), щоб серіалізувати форму та надсилати (використовуючи AJAX), додаючи свій власний заголовок.

Подивіться на jquery, serializeякий змінює HTML FORM на form-url-encodedзначення, готові до POST.

ОНОВЛЕННЯ

Моя пропозиція - включити будь-яке

  • прихований елемент форми
  • параметр рядка запиту

2
Я не можу використовувати ajax в цьому випадку. Якимось чином я надсилаю повідомлення та перенаправляю на сторінку aspx. Перенаправлення відбувається поштою.
Reza Owliaei

2
Моя пропозиція - включити або 1) прихований елемент форми 2) параметр рядка запиту
Aliostad

1
Чи можете ви серіалізувати файли? Я подумав: Ні.
Fallenreaper

Так, ви можете серіалізувати файли в рядки Base64, можливо, дуже незграбно для величезних файлів, оскільки Base64 може бути досить громіздким. Але так є у кожного способу серіалізації.
Феліпе

Я просто додаю його як парам-параметр рядка запиту і перевірте, чи існує заголовок або рядок запиту і має маркер.
James111

14

Встановіть на сторінці значення cookie, а потім прочитайте його на зворотному боці сервера.

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


3
Примітка. Якщо заголовок, який ви хочете додати, призначений для захисту CSRF, переконайтеся, що ви не зберігаєте цей маркер у файлі cookie, або ви переможете захист CSRF.
Джимофій

5

З документації FormData :

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

За допомогою XMLHttpRequestви можете встановити власні заголовки, а потім виконати POST.


2

Насправді кращий спосіб зробити це для збереження файлу cookie на стороні клієнта. Потім файл cookie автоматично надсилається із кожним заголовком сторінки для даного домену.

У node-js ви можете налаштувати і використовувати файли cookie з cookie-аналізатором .

приклад:

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

дайте мені зрозуміти краще: 1) повідомлення користувачів 2) збереження даних 3) переадресація. Це те, що ти робиш?
Фабіо Буда

У мене iFrame на сторінці Html (Джерело), ​​що вказує на іншу сторінку html (проксі). Сторінка проксі-сервера розміщує деякий параметр (No Get) через елемент форми. Перенаправлення та публікація відбувається під час надсилання форми. Я отримую розміщені параметри на сторінці aspx як місце призначення.
Reza Owliaei

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.