如何在SESSION到期后克服浏览器的“保存”功能?

时间:2015-03-13 21:58:37

标签: php session expired-sessions

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'];
}

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

在用户开始注意到某种行为之前,一切都很顺利:

  1. 他们使用脚本生成PDF
  2. 让浏览器闲置一段时间做其他事情,直到SESSION在幕后到期
  3. 然后他们使用浏览器的“另存为”功能来保存PDF。
  4. 浏览器不是从内存中保存PDF(PDF在浏览器中仍然可见),我们公司使用的浏览器(Mozilla)向服务器发出请求,要求提供新的PDF副本。但是......当这样做时,POST是空的,因为POST没有被重新发送,并且SESSION是空的,因为SESSION在空闲阶段已经过期。

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

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

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

    解决方法显然是在生成后很快保存PDF,在SESSION到期之前,但用户总是正确的#34;我想让用户即使在SESSION过期时也可以保存PDF。我的问题是"怎么"。

    如何?我该怎么办?

1 个答案:

答案 0 :(得分:0)

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

post是执行操作,浏览器正确不会重新发出该请求。根据你的描述,似乎没有看到pdf正在执行一个动作。

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

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