我尝试过
class UsersController extends AppController
{
public function beforeFilter(Event $event)
{
$this->getEventManager()->off($this->Csrf);
}
public function ajaxEdit($id = null)
{
$this->autoRender = false;
debug($id);
debug($this->request->getData());
}
我正在使用Ajax代码
$(document).ready(function(){
$('#user-profile').change(function(){
$('.loader-body').show();
var form = $('#user-profile-image')[0];
var formData = new FormData(form);
var tutorial_id = $('#user-file-id').val();
$.ajax({
url :"/users/ajax-edit/"+tutorial_id,
method:"POST",
data:formData,
contentType:false,
cache: false,
processData:false,
success:function(data){
let parseData = $.parseJSON(data);
if (parseData.status === true) {
location.reload();
var value = parseData.url;
console.log(value);
} else {
alert(parseData.message);
}
}
});
});
});
我已从这些链接中获得帮助
2 https://book.cakephp.org/3.0/en/controllers/components/csrf.html
获取 CSRF令牌不匹配(请参见附件图片)
答案 0 :(得分:1)
首先,如果您在ajax调用中使用POST方法,则应将tutorial_id作为数据发送,而不是在url中发送。
您可以通过在ajax调用中通过特殊的X-CSRF-Token标头向您发送CSRF令牌来解决此问题。 https://book.cakephp.org/3.0/en/controllers/components/csrf.html
beforeSend: function (xhr) {
xhr.setRequestHeader('X-CSRF-Token', $('[name="_csrfToken"]').val());
},
OR
您可以为ajax操作禁用CSRF组件[ Cakephp不推荐],
public function beforeFilter(Event $event) {
if (in_array($this->request->action, ['ajaxEdit'])) {
$this->eventManager()->off($this->Csrf);
}
}