如何在 expressjs 的 AJAX 请求(没有 Jquery)中发送 csrf 令牌?
How to send csrf token in AJAX request (Without Jquery) in expressjs?
我正在使用 expressjs 中的 csurf 模块。它适用于所有 post 请求,因为我按以下方式使用它。
app.use(csrf());
res.locals.csrfToken = req.csrfToken();
这样它会自动以所有形式提供,我有以下内容。
<input type="hidden" name="_csrf" value="<%=csrfToken%>">
但是如何在AJAX请求上设置csrftoken,我没有使用jquery,下面是发送AJAX请求的JS函数。我确实在 html 上拥有可用的 csrf 令牌作为我可以通过 getElementByID 访问的隐藏值。
注意:如果我禁用 csrf,我可以发送请求。
function voteQuestion () {
var qid = document.getElementById("qid").value;
var csrf = document.getElementById("csrf").value;
var http = new XMLHttpRequest();
var url = "/q/ajaxcall";
var params = "qid="+ qid;
http.open("POST", url);
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.onreadystatechange = function() {
if(http.readyState == XMLHttpRequest.DONE && http.status == 200) {
var json = (http.responseText);
var obj = JSON.parse(json);
document.getElementById("vote-sp").innerHTML = (obj.upvotes);
}
};
http.send(params);
}
在您的 params
中设置 crsf
令牌,如下所示..
var params = "qid="+ qid + "&crsf="+csrf;
或
您可以创建一个用于发送数据的新对象,如下所示..
var data = {}; //crates new object
data.qid = qis; //adds qid to object
data.csrf = csrf; //adds qid to object
params = data; // to server
我已经尝试解决这个问题将近一个星期了,只是决定 console.log req.session 并发现 cookie 包含 "XSRF-TOKEN" 值,所以在 AJAX 请求 header 我将 XSRF-TOKEN 设置为 csrf,现在它可以工作了,我不知道为什么它以这种方式工作,特别是对于 AJAX 请求。
setRequestHeader("XSRF-TOKEN", csrf);
我正在使用 expressjs 中的 csurf 模块。它适用于所有 post 请求,因为我按以下方式使用它。
app.use(csrf());
res.locals.csrfToken = req.csrfToken();
这样它会自动以所有形式提供,我有以下内容。
<input type="hidden" name="_csrf" value="<%=csrfToken%>">
但是如何在AJAX请求上设置csrftoken,我没有使用jquery,下面是发送AJAX请求的JS函数。我确实在 html 上拥有可用的 csrf 令牌作为我可以通过 getElementByID 访问的隐藏值。
注意:如果我禁用 csrf,我可以发送请求。
function voteQuestion () {
var qid = document.getElementById("qid").value;
var csrf = document.getElementById("csrf").value;
var http = new XMLHttpRequest();
var url = "/q/ajaxcall";
var params = "qid="+ qid;
http.open("POST", url);
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.onreadystatechange = function() {
if(http.readyState == XMLHttpRequest.DONE && http.status == 200) {
var json = (http.responseText);
var obj = JSON.parse(json);
document.getElementById("vote-sp").innerHTML = (obj.upvotes);
}
};
http.send(params);
}
在您的 params
中设置 crsf
令牌,如下所示..
var params = "qid="+ qid + "&crsf="+csrf;
或
您可以创建一个用于发送数据的新对象,如下所示..
var data = {}; //crates new object
data.qid = qis; //adds qid to object
data.csrf = csrf; //adds qid to object
params = data; // to server
我已经尝试解决这个问题将近一个星期了,只是决定 console.log req.session 并发现 cookie 包含 "XSRF-TOKEN" 值,所以在 AJAX 请求 header 我将 XSRF-TOKEN 设置为 csrf,现在它可以工作了,我不知道为什么它以这种方式工作,特别是对于 AJAX 请求。
setRequestHeader("XSRF-TOKEN", csrf);