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

时间:2018-08-08 10:35:37

标签: ajax cakephp-3.0

我尝试过

  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

1 个答案:

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