问题:我(第一次)在AJAX呼叫中收到403,同时发送带有CSRF令牌隐藏字段的表单字段
我正在使用form_open
通过以下方式自动创建隐藏的CSRF令牌:
配置
$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_token';
$config['csrf_cookie_name'] = 'csrf_cookie';
$config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = FALSE;
$config['csrf_exclude_uris'] = array();
AJAX通话
var $form = $("#form_step_0");
$form.submit(function (e) {
e.preventDefault();
var formData = new FormData($form);
console.log("action = " + $form.attr('action'));
console.log("method = " + $form.attr('method'));
console.log($form.serialize());
$.ajax({
url: base_url + 'sign-up/store',
type: 'POST',
data: $form.serialize(), // tried formData as well
processData: false,
contentType: false,
success: function () {
// alert("ajax call success");
},
error: function () {
// alert("ajax call error");
}
});
});
HTML:
<?= form_open(base_url('sign-up/store'),'class="form-horizontal" id="form_step_0"')?>
错误:
遇到错误
您请求的操作是不允许的。
注意:,我可以通过将ajax type: 'POST'
更改为GET
来使它正常工作,但这只是因为CI无法验证其GET请求是否有效?我猜。
我已经调试了几个小时,但是这里没有任何内容,而Google似乎可以解决我的问题。大多数情况要么是第二个AJAX调用中的403,要么是$config['csrf_regenerate']
设置为TRUE
,这都不是我的情况。
我发现从AJAX调用中删除processData: false, contentType: false,
时它开始工作,这反过来又意味着我无法使用FormData提交我的数据和文件。
任何能为使用CSRF令牌上传ajax文件提供解决方法的人都会感激不尽。