CodeIgniter4:使用Ajax重新提交表单,给出403禁止

时间:2020-05-10 11:23:43

标签: php http-status-code-403 codeigniter-4

我正在使用CodeIgniter4中的一个项目。我正在尝试对端点(/adjustments/store)进行Ajax调用。我正在使用CodeIgniter验证表单,并在视图中显示验证错误。问题是,当我第一次提交表单时,它可以工作并显示一些验证错误。但是,当我填写正确性表格(以免出现验证错误)并再次重新提交时,控制台中出现403禁止错误。

Ajax通话

$.ajax({
    type: 'post',
    url: '/adjustments/store',
    dataType: 'html',
    data: {
      number,
      date,
      type,
      account,
      description,
      adjData,
      csrf_test_name
    },
    success: function (res) {
      if (IsJsonString(res)) {
        const response = JSON.parse(res);

        if (response.hasOwnProperty('validation_errors')) {
          const errors = response.validation_errors;
          for (err in errors) {
            $(`input[name=${ err }]`)
             .parent()
             .append(`<small class="text-danger">${ errors[err] }</small>`)
         }
      }
   }

  function IsJsonString(str) {
     try {
        JSON.parse(str);
     } catch (e) {
       return false;
     }
     return true;
 }

console.log(res);

}

CodeIgniter控制器

public function store () {
        $data = $this->request->getPost(NULL);

        // Validate
        if (! $this->validate([
            'number' => 'required',
            'date' => 'required',
            'type' => 'required',
            'adjData' => 'required',
        ]))
        {
            echo json_encode(['validation_errors' => $this->validator->getErrors()]);
            return;
        }

        echo json_encode($data);
}

有什么解决办法吗?

1 个答案:

答案 0 :(得分:0)

如果您重新提交表单,那么您每次使用ajax进行的更新都csrf token

每当验证失败时,都要通过csrf token并每次进行更新。

在您的控制器中-

public function store () {
        $data = $this->request->getPost(NULL);

        // Validate
        if (! $this->validate([
            'number' => 'required',
            'date' => 'required',
            'type' => 'required',
            'adjData' => 'required',
        ]))
        {
            echo json_encode(['validation_errors' => $this->validator->getErrors(), 'csrf' => csrf_hash()]);
            return;
        }

        echo json_encode($data);
}

在你的ajax中-

$.ajax({
    type: 'post',
    url: '/adjustments/store',
    dataType: 'html',
    data: {
      number,
      date,
      type,
      account,
      description,
      adjData,
      csrf_test_name
    },
    success: function (res) {
      if (IsJsonString(res)) {
        const response = JSON.parse(res);
          $("input[name='csrf_test_name']").val(response ["csrf"]);
        if (response.hasOwnProperty('validation_errors')) {
          const errors = response.validation_errors;
          for (err in errors) {
            $(`input[name=${ err }]`)
             .parent()
             .append(`<small class="text-danger">${ errors[err] }</small>`)
         }
      }
   }

  function IsJsonString(str) {
     try {
        JSON.parse(str);
     } catch (e) {
       return false;
     }
     return true;
 }

因此,一旦您更新csrf,它将可以正常工作。

谢谢。