首页 文章

如何在expressjs中的AJAX请求(没有Jquery)中发送csrf令牌?

提问于
浏览
1

我在expressjs中使用csurf模块 . 它适用于所有发布请求,因为我使用以下方式 .

app.use(csrf());
res.locals.csrfToken = req.csrfToken();

这样它可以自动提供所有形式,我有以下内容 .

<input type="hidden" name="_csrf" value="<%=csrfToken%>">

但是如何在AJAX请求上设置csrftoken,我不使用jquery,下面是JS函数发送AJAX请求 . 我确实在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);

}

2 回答

  • 0

    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
    
  • 0

    我一直试图解决这个问题差不多一个星期了,刚刚决定使用console.log req.session并发现cookies包含“XSRF-TOKEN”值,因此在AJAX请求 Headers 中我将XSRF-TOKEN设置为csrf,现在它工作,我不知道为什么它以这种方式工作,特别是对于AJAX请求 .

    setRequestHeader("XSRF-TOKEN", csrf);
    

相关问题