2016-12-31 46 views
0

我試圖使用普通的JavaScript XMLHttpRequest()調用一個codeigniter控制器,有csrf和再生激活 ajax調用。它只適用於從表單中獲取數據和標記的情況,否則我會得到403(禁止)。 這裏是JS:XMLHttpRequest()POST調用codeigniter 3 403(禁止)由於csrf保護

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() { 
} 
} 

這裏是笨控制器:

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); 
} 
} 

所以我嘗試添加該令牌在頭也是在要發送的數據,無論是工作不即使從第一個電話。如果可能的話(某些瀏覽器具有設置標題的問題),我希望通過在標題中包含令牌數據和而不是來使其工作。 請沒有jQuery解決方案,我需要這一個工作使用普通的JavaScript。 在此先感謝。

回答

1

我找到了解決辦法,也許這將幫助別人,需要發送到控制器的數據以這種格式被序列化:

var data = "csrf_test_name="+csrfToken;