错误:cakephp 3.6.10中的CSRF令牌不匹配

时间:2018-08-09 23:23:02

标签: cakephp cakephp-3.0

我正在进行简单的选择更改。但是我遇到了一个问题ang并收到以下错误:

Error: [Cake\Http\Exception\InvalidCsrfTokenException] CSRF token mismatch.

这是我在控制器上的功能

public function municipios() {

$this->viewBuilder()->layout('ajax');
$this->LoadModel('Municipios');
$subregion = $this->request->getData['subregion_id'];


    $municipios = $this->Municipios->find('list',[
        'limit' => 200,

        'conditions' => ['Municipios.subregion_id' => $subregion],
        'contain' => ['Subregiones']

       ]);

    $this->set(compact('municipios'));
    $this->set('_serialize', 'municipios');

}

这是我的jquery ajax:

$(document).ready(function () {
    $("#subregion-id").bind("change",
    function (event) {
      $.ajax({
    async:true,
    data: $("#subregion-id").serialize(),
    dataType:"html",
    success:
    function (data, textStatus) {
      $("#municipio-id").html(data);
      },
      type:"post", url:"\/lavaderos\/municipios"});
  return false;
      });
  });

我阅读了需要令牌的文档,但我不知道该怎么做。

该代码在3.5.x中可以正常工作,但在3.6.x中则不能工作

谢谢

1 个答案:

答案 0 :(得分:3)

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

$(document).ready(function () {
    $("#subregion-id").bind("change",
    function (event) {
      $.ajax({
    async:true,
    data: $("#subregion-id").serialize(),
    dataType:"html",
    beforeSend: function (xhr) { // Add this line
        xhr.setRequestHeader('X-CSRF-Token', $('[name="_csrfToken"]').val());
    },  // Add this line
    success:function (data, textStatus) {
      $("#municipio-id").html(data);
    },
      type:"post", url:"\/lavaderos\/municipios"});
  return false;
      });
  });

OR

您可以为ajax操作禁用CSRF组件[Cakephp不建议使用]:

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