我必须请求帮助来解决Codeigniter中的AJX调用问题。 我在我的系统中有CSRF保护,通常即使使用AJAX / jQuery调用也能正常工作。 现在我遇到了以下代码的麻烦,我无法修复它......只是头疼得厉害 我想要做的是每次更改一个复选框状态时调用一个控制器(我正在使用Switchery);我想让开关正常工作几次......不只是在第一个开关上。 javascript代码如下:
$(document).ready(function() {
var csrfName = '<?php echo $this->security->get_csrf_token_name(); ?>';
var csrfHash = '<?php echo $this->security->get_csrf_hash(); ?>';
var changeCheckbox = document.querySelector('.js-switch'), changeField = document.querySelector('#results');
changeCheckbox.onchange = function() {
changeField.innerHTML = changeCheckbox.checked;
$.ajax({
url: 'myphpfile',
type: 'POST',
data : {
csrfName: csrfHash,
"checked": changeCheckbox.checked
},
dataType: "json",
success: function(result){
$("#results").append(result.error);
csrfName = result.csrfHash;
}
});
};
});
上面的脚本即使在第一次尝试时也不起作用,我得到403错误(禁止)所以,csrf哈希根本没有传递....这真的很奇怪,因为如果我设置(使用PHP回声)代码)csrf名称和csrf哈希直接进入S.ajax数据括号,脚本工作正常......即使只有一次。 所以问题是:为什么csrfName和csrfHash变量不会传递给数据?如何让AJAX csrf几次正常工作? 抱歉我的英语不好,希望我解释了我的问题 非常感谢您的帮助
答案 0 :(得分:0)
你的意思可能是:
var data = {"checked": changeCheckbox.checked};
data[csrfName] = csrfHash;
然后:
$.ajax({
url: 'myphpfile',
type: 'POST',
data : data
[...]
csrfName
是一个变量,因此如果要添加以csrfName
为内容命名的属性,则必须使用object [variable]语法。
写下:
data : {
csrfName: csrfHash
}
您正在创建一个具有csrfName
属性的对象,而不是其内容。
或者如果你正在使用ES6,你可以写:
data : {
[csrfName]: csrfHash,
"checked": changeCheckbox.checked
}
答案 1 :(得分:0)
请注意,您只需要使用jquery.cookie方法发送csrfhash和csrfcookie值,就可以更多地进行一次ajax调用。您可以下载jquery.cookie https://github.com/js-cookie/js-cookie 并通过像这样的ajax传递csrf的值。
"data:<?php echo $this->security->get_csrf_token_name(); ?>": Cookies.get('csrf_cookie_name')
根据你的cookie名称更改csrf_cookie_name并完成。希望能帮到你