Як я можу встановити спеціальне поле у заголовку POST після подання форми?
Як я можу встановити спеціальне поле у заголовку POST після подання форми?
Відповіді:
Це неможливо зробити - AFAIK.
Однак ви можете використовувати, наприклад, jquery (хоча ви можете це робити за допомогою простого javascript), щоб серіалізувати форму та надсилати (використовуючи AJAX), додаючи свій власний заголовок.
Подивіться на jquery, serialize
який змінює HTML FORM на form-url-encoded
значення, готові до POST.
Моя пропозиція - включити будь-яке
Встановіть на сторінці значення cookie, а потім прочитайте його на зворотному боці сервера.
Ви не зможете встановити конкретний заголовок, але значення буде доступне в розділі заголовків, а не в тілі вмісту.
З документації FormData :
XMLHttpRequest рівень 2 додає підтримку нового інтерфейсу FormData. Об'єкти FormData надають спосіб легко побудувати набір пар ключів / значень, що представляють поля форми та їх значення, які потім можуть бути легко надіслані за допомогою
XMLHttpRequest
send()
методу.
За допомогою XMLHttpRequest
ви можете встановити власні заголовки, а потім виконати POST
.
Насправді кращий спосіб зробити це для збереження файлу 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, якщо ви зберігаєте якусь конфіденційну інформацію, пов’язану з користувачем, як правило.
Ось що я робив у пабі / нефриті
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
Якщо ви використовуєте JQuery з плагіном Form, ви можете використовувати:
$('#myForm').ajaxSubmit({
headers: {
"foo": "bar"
}
});
Ви можете використовувати $ .ajax, щоб уникнути природної поведінки <form method="POST">
. Наприклад, ви можете додати подію до кнопки подання і розглядати запит POST як AJAX.
Щоб додати кожен запит на 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
XmlHttpRequest
ви маєте на увазі? Або просто звичайний пост у форматі HTML?