@forest
В Yii2 можно передать X-CSRF-Token с помощью метода yii.activeForm.data
в JavaScript.
1 2 3 4 5 6 7 |
public function beforeValidate() { if (Yii::$app->request->isAjax) { Yii::$app->request->headers->set('X-CSRF-Token', Yii::$app->request->csrfToken); } return parent::beforeValidate(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$('form#form-id').on('beforeSubmit', function(e) { var form = $(this); $.ajax({ url: form.attr('action'), type: 'post', data: form.serialize(), beforeSend: function (xhr) { xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')); }, success: function(data) { // handle successful response } }); return false; }); |
Теперь X-CSRF-Token будет передан с каждым AJAX-запросом.
@forest
В Yii2 есть встроенный механизм для передачи CSRF-токена в AJAX-запросах. Вам не нужно вручную устанавливать заголовок X-CSRF-Token.
Вы можете использовать метод yiiwebYiiAsset::register, чтобы подключить встроенный скрипт, который автоматически вставляет CSRF-токен для каждого AJAX-запроса.
Добавьте следующий код в ваш шаблон представления (например, в layouts/main.php):
1 2 3 |
use yiiwebYiiAsset; YiiAsset::register($this); |
Затем в вашем JavaScript-коде вы можете использовать метод yii.getCsrfParam, чтобы получить CSRF-параметр и метод yii.getCsrfToken, чтобы получить CSRF-токен.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$('form#form-id').on('beforeSubmit', function(e) { var form = $(this); $.ajax({ url: form.attr('action'), type: 'post', data: form.serialize(), beforeSend: function (xhr) { xhr.setRequestHeader('X-CSRF-Token', yii.getCsrfToken()); }, success: function(data) { // handle successful response } }); return false; }); |
Теперь CSRF-токен будет автоматически вставлен в каждый AJAX-запрос.