由于 csrf 保护,XMLHttpRequest() POST 在 codeigniter 3 403(禁止)中调用

XMLHttpRequest() POST call in codeigniter 3 403 (Forbidden) due to csrf protection

我正在尝试使用普通 javascript XMLHttpRequest() 向已激活 csrf 和重新生成 的 codeigniter 控制器发出 ajax 调用。只有当我从表单中收集数据和令牌时它才有效,否则我会收到 403(禁止访问)。 这是 JS:

function test_ajax() {
var ajax = new XMLHttpRequest();
    var data = {'csrf_test_name':csrfToken} ;
ajax.addEventListener("load", completeHandler, false);
ajax.addEventListener("error", errorHandler, false);
ajax.addEventListener("abort", abortHandler, false);
ajax.open("POST", base_url+'admin/test_ajax');
ajax.setRequestHeader('X-Requested-With', 'XMLHTTPRequest');
ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;   charset=UTF-8');
ajax.setRequestHeader('csrf_test_name', csrfToken);
ajax.responseType = "json";
ajax.send(data);

function completeHandler() {
    console.log(event.target.response);
}
function errorHandler() {
}
function abortHandler() {
 }
}

这是 codeigniter 中的控制器:

class Admin extends CI_Controller{
public function __construct(){
    parent::__construct();
    $this->load->library('session');
    $this->load->helper('url_helper');
    $this->load->helper('security');
    $this->load->helper('cookie');
 }
public function test_ajax(){
  $x = array('test1','test2');
    echo json_encode($x);
    //var_dump($x);
}
}

所以我尝试在 header 中添加令牌,也在要发送的数据中,两者都不起作用 甚至从第一次调用 开始也不行。如果可能的话,我更喜欢通过在数据中包含令牌并在 header 中包含 not 来使其工作的解决方案(某些浏览器在设置 headers 时存在问题). 请 没有 jQuery 解决方案,我需要这个才能使用普通 javascript。 提前致谢。

我找到了解决方案,也许这会对某些人有所帮助,发送到控制器的数据需要以这种格式序列化:

var data = "csrf_test_name="+csrfToken;