在 CakePHP 3.6 中使用 ajax 上传图像时 CSRF 令牌不匹配

CSRF token mismatch while uploading image using ajax in CakePHP 3.6

我试过了

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

我已关注这些链接的帮助

  1. CakePHP ajax CSRF token mismatch

2 https://book.cakephp.org/3.0/en/controllers/components/csrf.html

获取 CSRF 令牌不匹配(见附图)

https://i.stack.imgur.com/FsVZu.png

首先,如果您在 ajax 调用中使用 POST 方法,那么您应该将 tutorial_id 作为数据发送,而不是在 url 中发送。

您可以通过 ajax 调用中的特殊 X-CSRF-Token header 向您发送 CSRF 令牌来解决此问题。 https://book.cakephp.org/3.0/en/controllers/components/csrf.html

    beforeSend: function (xhr) {
    xhr.setRequestHeader('X-CSRF-Token', $('[name="_csrfToken"]').val());
},

您可以为您的 ajax 操作禁用 CSRF 组件[Cakephp 不推荐],例如:

public function beforeFilter(Event $event) {
     if (in_array($this->request->action, ['ajaxEdit'])) {
         $this->eventManager()->off($this->Csrf);
     }
 }