【问题标题】:Yii When using PageCaching in ajax call not workingYii 在 ajax 调用中使用 PageCaching 时不起作用
【发布时间】:2018-12-13 02:49:14
【问题描述】:

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

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

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

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

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

此问题与 cookie/会话或其他有关吗?如何解决?

【问题讨论】:

    标签: yii2 page-caching


    【解决方案1】:

    400 Bad Request 是因为csrf-token 没有被发送,当您使用POST 提交页面或ajax 请求时,该请求需要防止Yii 跨站点攻击,如果您创建一个ActiveForm 然后它会使用令牌值自动创建一个输入。

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

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

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

    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);
            }
        }
    );
    

    如果您在SiteController 中有一个test 操作并带有以下代码,那么上面的ajax 调用应该会在控制台内向您显示$_POST 数组,其中csrf 参数和令牌值为key=>value

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

    【讨论】:

    • 感谢您的回复。
    • 感谢您的回复。但问题仍然没有解决。我认为您在这里错过了“PageCache”。让我解释一下:我在主页上使用页面缓存,它有注册表单和搜索输入字段(它使用 ajax POST 调用来获取数据)。当重新加载用户登录页面(请注意此处仍在使用页面缓存)然后尝试搜索然后搜索输入字段使用的 ajax 调用显示上述错误。我也使用您在回复中编写的相同代码。我正在发送 csrf 令牌。是否真的与 yii2 中的 csrf 或页面缓存有关?
    • 据我在 ajax POST 调用中遇到的 404 主要与缺少 csrf 令牌有关,您能否更新您的问题并添加相关代码 @SameerSood 也尝试使用 $this->enableCsrfValidation=false 禁用 csrf在 beforeAction 中,就像在这个 POST 中一样,并检查 ajax 调用是否有效,如果有效,那么它肯定是相关的。
    • 是的,我已经尝试在控制器中禁用 csrf,然后一切正常。但我对这个解决方案不满意。我想知道这个问题背后的原因。我应该提供哪个代码部分以便我们可以验证真正的问题
    • @SameerSood 如果它在 diaabling csrf 之后可以工作,那么这就是我所说的并且上面提供了代码,您现在应该添加您的代码,否则我将无法提供任何帮助,因为我已经建议了解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 2017-06-10
    相关资源
    最近更新 更多