Yii При использовании PageCaching в ajax вызов не работает - PullRequest
0 голосов
/ 12 декабря 2018

Я пытался реализовать кэширование страниц в продвинутом проекте Yii2, и все оказалось очень круто.И вдруг меня поразила странная проблема.

Случай: На главной странице сайта есть некоторые динамические данные, такие как показ записей из БД, информация о текущем пользователе, такая как имя (если пользователь вошел в систему).) и некоторый статический контент.Кроме того, поле ввода для поиска, которое выбирает результат с помощью вызова AJAX.

Для ускорения загрузки страницы я реализовал PageCaching, предоставляемый Yii2.И все работало хорошо.Но одна проблема, с которой я застрял, заключается в том, что после входа пользователя вызов ajax не работал и выдал ошибку:

Неверный запрос (# 400): невозможно проверить отправку данных.

Я получаю эту ошибку до тех пор, пока кеш не обновится по истечении заданного времени или я отключу кеш.

Эта проблема связана с файлом cookie / сеансом или чем-то еще?Как это решить?

1 Ответ

0 голосов
/ 12 декабря 2018

400 Bad Request - потому что csrf-token не отправляется, с запросом, который необходим для предотвращения межсайтовых атак Yii всякий раз, когда вы используете POST для отправки запроса страницы или ajax, если вы создаетеActiveForm затем автоматически создает ввод со значением токена.

Вы не добавили код, который используете для вызова ajax, поэтому неясно, используете ли вы его только для одного поля или всей формы, поэтому я бы предложил только соответствующую часть.

Вам необходимо отправить токен csrf, и вы можете получить его через javascript, используя yii.js и вызывая эти 2 метода

  • yii.getCsrfParam(), чтобы получить имя параметра токена
  • yii.getCsrfToken() для получения токена или фактического значения токена csrf

Имя csrfParam настраивается внутри frontend/config.php или config/web.php в зависимости от приложениявы используете (продвинутый / базовый) в компоненте request, как показано ниже

'components'=>[
    ......
    ......
    'request' => [
        'csrfParam' => '_csrf-frontend',
    ],
    ......
    ......
]

Так что вам нужно либо изменить метод запроса с POST на GET и отправить данные с помощью запросавведите строку или используйте следующий способ для отправки запроса POST.

Note: You should change the URL and add the csrf data into your existing data that you are sending with the request

let data={};
data[yii.getCsrfParam()]=yii.getCsrfToken();
$.ajax(
    {
        method:"POST",
        url:"/site/test",
        data:data,
        success:function(data) {
            console.log(data);
        },
        error:function(jqXHR,textStatus,errorThrown) {
            console.log(jqXHR,textStatus,errorThrown);
        }
    }
);

Если у вас есть действие test внутри SiteController со следующим кодом, то вышеупомянутый вызов ajax должен показать вам массив $_POST внутри консоли с параметром csrf и значением токена как key=>value.

public function actionTest()
{
    print_r($_POST);
}
...