0

我试图在 Yii2 高级项目中实现页面缓存,一切似乎都非常酷。突然间,我遇到了一个奇怪的问题。

案例:在网站的主页上有一些动态数据,如显示来自数据库的记录、当前用户的信息如姓名(如果用户已登录)和一些静态内容。此外,还有一个搜索输入字段,它使用 AJAX 调用获取结果。

为了加快页面加载,我实现了 Yii2 提供的 PageCaching。一切都很好。但是我遇到的一个问题是,在用户登录后,ajax 调用不起作用并给出了错误:

错误请求 (#400):无法验证您的数据提交。

在设置的持续时间后刷新缓存或禁用缓存之前,我会收到此错误。

这个问题与 cookie/session 或其他有关吗?如何解决?

4

1 回答 1

0

400 Bad Request是因为没有发送请求,每当您使用提交页面或 ajax 请求时,csrf-token为了防止 Yii 进行跨站点攻击,如果您创建一个,那么它会使用令牌值自动创建一个输入。POSTActiveForm

您没有添加用于 ajax 调用的代码,因此不清楚您是仅将其用于一个字段还是整个表单,因此我只建议相关部分。

您需要发送 csrf-token,您可以通过 javascript 使用yii.js和调用这两种方法来获取它

  • yii.getCsrfParam()获取token的参数名称
  • yii.getCsrfToken()获取 csrf-token 的 token 或实际值

csrfParam名称在您的内部配置frontend/config.phpconfig/web.php取决于您在request组件下使用的应用程序(高级/基本),如下所示

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

因此,您需要做的是将请求方法从POSTto更改为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动作,那么上面的 ajax 调用应该向您显示控制台内的数组,其中 csrf 参数和令牌值为.SiteController$_POSTkey=>value

public function actionTest()
{
    print_r($_POST);
}
于 2018-12-12T08:58:00.367 回答