缓存Ajax调用


Cached Ajax Call

我正在构建的应用程序中有一个问题。我读了很多关于类似问题的帖子,并应用了这些帖子中给出的建议。然而,这个问题仍然存在,因此我写了这篇文章。

设置如下:

  1. 我有3个php文件:index.php, step_one.phpcalculation.php
  2. index.php,我通过Ajax调用成功加载step_one.php,如下所示:

    $(document).ready(function () {
            var nocache = Math.random() * new Date().getTime() + Math.random();
                $("#bookings").click(function () {
                    $.ajax({
                        url: 'step_one.php?cach='+nocache,
                        type: 'post',
                        cache: false,
                        success: function (data) {
                            $("#contentLeft").html(data);
                        }
                    });
                });
            });
    

注:step_one.php为html格式。然后在step_one.php中,我在表单中输入数据,并通过另一个Ajax调用将表单数据发送给calculation.php,如下所示:

$("#viewprice").click(function () {
    var nocache = Math.random() * new Date().getTime() + Math.random();
    $.ajax({
        url: 'calculate_quote.php?cache=' + nocache,
        type: 'post',
        dataType: 'json',
        cache: false,
        data: $("#stepOneForm").serialize(),
        success: function (data) {
            console.log(data);
            $(".quote").append(data);
            $(".quote").show();
            document.getElementById("price").value = data;
        }
    });
});

calculation.php文件根据它接收到的数据计算价格,并将json返回给step_one.php。这就是我如何从calculation.php返回json:

header('Content-Type: application/json');
header('Cache-Control: no-cache, no-store, must-revalidate'); // HTTP 1.1.
header('Expires: 0'); // Proxies.
echo json_encode($data);

注意:我第一次点击#viewprice按钮,价格正确,并成功返回step_one.php。但是,当我在step_one.php中输入新数据并重新单击#viewprice按钮时,calculation.php没有返回任何内容。当我检查网络数据时,我看到calculation.php在那里被复制,只有第一个Ajax调用将数据放在其响应中。

在xamp的本地机器上运行。请你帮忙好吗?我哪里做错了?

我找到了让我头疼的bug。逻辑错误

出于安全原因,我在表单中使用令牌。因此,对于每个表单,我在页面加载时生成一个令牌并将其存储在会话中。然后,当表单发送其数据(包括令牌)时,我首先检查接收到的令牌是否在会话中—如果找到令牌,则使用接收到的值并使用它们计算$data,然后将其传递给json_encode函数。找到令牌后,我将删除

所以,calculation.php不是缓存我的Ajax代码是正确的。相反,问题是当我重新发送表单数据进行重新计算时。重发时,会话中的令牌已被删除;因此,我与表单数据一起发送的令牌无法在会话中找到。因此,不计算数据,不返回任何内容。

缓存Ajax POST请求

认为上面的链接会有用>>