[英]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.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 PARAM和令牌值作为控制台内部数组key=>value
。
public function actionTest()
{
print_r($_POST);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.