繁体   English   中英

Yii在ajax调用中使用PageCaching时不起作用

[英]Yii When using PageCaching in ajax call not working

我试图在Yii2高级项目中实现页面缓存,而且一切似乎都很棒。 突然我被一个奇怪的问题打了。

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

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

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

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

这个问题与Cookie /会话有关吗? 怎么解决呢?

400 Bad Request是因为未发送csrf-token ,该请求是防止Yii进行跨站点攻击所必需的,无论您何时使用POST提交页面或ajax请求,如果创建了ActiveForm它都会创建一个使用令牌值自动输入。

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

您需要发送csrf令牌,并且可以使用yii.js并调用这2种方法通过javascript获取它

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

csrfParam名称是在您的frontend/config.phpconfig/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 PARAM和令牌值作为控制台内部数组key=>value

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM