【发布时间】:2012-03-19 23:40:19
【问题描述】:
如何在提交表单时在 POST 标头中设置自定义字段?
【问题讨论】:
-
你的意思是使用
XmlHttpRequest?还是只是一个普通的 HTML FORM 帖子? -
不,我正在使用表单操作:发布
标签: javascript html post http-post httprequest
如何在提交表单时在 POST 标头中设置自定义字段?
【问题讨论】:
XmlHttpRequest?还是只是一个普通的 HTML FORM 帖子?
标签: javascript html post http-post httprequest
这是不可能的 - AFAIK。
但是,您可以使用例如 jquery(尽管您可以使用纯 javascript)来序列化表单并发送(使用 AJAX),同时添加您的自定义标题。
查看 jquery serialize,它将 HTML FORM 更改为 form-url-encoded 值,准备 POST。
我的建议是包括任一
【讨论】:
在页面上设置一个cookie值,然后在服务器端读回。
您将无法设置特定的标头,但可以在标头部分而不是内容正文中访问该值。
【讨论】:
来自FormData文档:
XMLHttpRequest Level 2 增加了对新的 FormData 接口的支持。 FormData 对象提供了一种方法来轻松构造一组表示表单字段及其值的键/值对,然后可以使用
XMLHttpRequestsend()方法轻松发送。
使用XMLHttpRequest,您可以设置自定义标题,然后执行POST。
【讨论】:
事实上,在客户端保存 cookie 是一种更好的方法。然后 cookie 会自动与该特定域的每个页面标题一起发送。
在 node-js 中,您可以通过cookie-parser 设置和使用 cookie。
一个例子:
res.cookie('token', "xyz....", { httpOnly: true });
现在你可以访问这个了:
app.get('/',function(req, res){
var token = req.cookies.token
});
请注意,httpOnly:true 确保 cookie 通常无法手动或通过 javascript 访问,并且只有浏览器才能访问它。
如果您想通过表单发布而不是通过 ajax 发送一些标题或安全令牌,在大多数情况下这可以被认为是一种安全的方式。尽管如果您要存储一些敏感的用户相关信息(通常是这种情况),请确保通过安全协议 /ssl 发送数据。
【讨论】:
这是我在 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
【讨论】:
您可以使用 $.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"
});
您必须在 JSP 中添加 meta 元素,例如
<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
【讨论】:
如果你使用 JQuery 和 Form 插件,你可以使用:
$('#myForm').ajaxSubmit({
headers: {
"foo": "bar"
}
});
【讨论】: