如何在会话过期后克服浏览器的“保存”功能


How to overcome browser's "Save" feature after SESSION expires?

PDF 生成取决于 $_POST

我在浏览器中使用 PHP 脚本生成 PDF,其中 PDF 生成脚本依赖于通过 POST 发送给它的变量。 当 POST 为空时,无法生成 PDF,并发出警告"必须重新生成 PDF"。

某些情况触发 POST 数组为空,即,如果我在带有 PDF 的页面上点击浏览器的刷新按钮,无论出于何种原因,POST 数据都不会重新发送,也没有提示要求我重新发送它,它只是变成空,脚本检测到它并发出警告。 警告是 PDF Must be Regenerated ,这是我在代码中的 POST 数组为空时输入的内容。

PDF 生成解决方法取决于 $_SESSION

所以我做的一个解决方法是将 POST 数据保存到 SESSION,然后在 POST 为空时使用 SESSION。 如下所示:

if (empty($_POST))
{
    // try restore from session first
    $_POST['product_count'] = $_SESSION['product_count'];
    if (empty($_POST['product_count'])) // if we failed.. session is empty
    {
        print 'PDF Must be Regenerated';
        exit();
    }
}
else
{
    //save POST into SESSION
    $_SESSION['product_count'] = $_POST['product_count'];
}

浏览器的保存功能尝试在会话过期后生成PDF

一切都很好,直到用户开始注意到某种行为:

  1. 他们使用脚本生成PDF
  2. 让浏览器闲置一段时间,执行其他业务,直到 SESSION 在后台过期
  3. 然后他们使用浏览器的另存为功能来保存 PDF。
浏览器

不是从内存中保存PDF(PDF在浏览器中仍然可见),而是我们公司使用的浏览器(Mozilla),向服务器发出请求,要求提供PDF的新副本。 但。。。这样做时,POST 为空,因为未重新发送 POST,而 SESSION 为空,因为会话在空闲阶段已过期。

这会导致 PDF 损坏,其中 PDF 实际上是包含单词 PDF Must be Regenerated 的 ASCII 文本文件。 用户直到为时已晚才注意到它。

但是,Mozilla显然调用了服务器,PHP脚本通过了用户登录凭据测试,但同时具有空的POST和SESSION,导致PDF损坏。

登录凭据检查不依赖于SESSION,老实说,我还不能说它依赖于什么,因为我无法轻松重现该问题,因此我无法轻松测试。

解决方法显然是在生成 PDF 后不久,在 SESSION 过期之前保存它,但用户"永远是对的",我希望让用户即使在 SESSION 过期时也能保存 PDF。 我的问题是"如何"。

如何? 我能做什么?

pdf的东西似乎肯定是浏览器上的错误。 但无论如何,你想使用 GET。

POST 是执行一个操作,浏览器不会正确地重新发出该请求。从您的描述来看,查看 pdf 似乎没有执行操作。

如果您使用 GET,则意味着使用这些参数获取此数据。 浏览器将相应地处理它。

如果它是操作的结果,则将操作和报告分成两个请求。 例如,将查看生成的 PDF 报告作为操作响应中的链接。 例如,当您在线购买某人时,您可以看到这种模式。 付款 POST 请求通过 GET 为您提供指向发票的链接。