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

Php 会话过期后如何克服浏览器的“保存”功能?,php,session,expired-sessions,Php,Session,Expired Sessions,PDF生成依赖于$\u POST 我在浏览器中使用PHP脚本生成PDF,其中PDF生成脚本取决于通过POST发送给它的变量。当POST为空时,无法生成PDF,并发出警告,说明必须重新生成PDF 某些情况会触发POST数组为空,即,如果我在带有PDF的页面上点击浏览器的刷新按钮,无论出于何种原因,POST数据不会重新发送,也没有提示要求我重新发送,它只是变为空,脚本检测到它并发出警告。警告是PDF必须重新生成,这是我在代码中POST数组为空时输入的内容 PDF生成解决方案取决于$\u会话 所以我所

PDF生成依赖于$\u POST

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

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

PDF生成解决方案取决于$\u会话

所以我所做的一项工作是将POST数据保存到会话中,然后在POST为空时使用会话。如下图所示:

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

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

他们使用脚本生成PDF 让浏览器闲置一段时间做其他事情,直到会话在幕后过期 然后他们使用浏览器的另存为功能来保存PDF。 浏览器,而不是从内存中保存PDF PDF在浏览器中仍然可见,我们公司使用的浏览器Mozilla,向服务器发出请求,要求提供PDF的新副本。但是执行此操作时,POST为空,因为POST未重新发送,而会话为空,因为会话在空闲阶段已过期

这将导致损坏的PDF,其中PDF实际上是一个ASCII文本文件,包含必须重新生成PDF的单词。用户直到太晚才注意到它

但是,Mozilla显然向服务器发出了一个调用,PHP脚本通过了用户登录凭据测试,但始终有空的POST和会话,导致PDF损坏

登录凭据检查不依赖于会话,老实说,我还不能说出它依赖于什么,因为我无法轻松重现问题,因此无法随时进行测试

解决办法显然是在生成PDF后不久,即会话到期之前保存PDF,但用户总是正确的,我希望用户能够在会话到期时保存PDF。我的问题是怎么做


怎么做?我能做什么

pdf格式的东西看起来肯定是浏览器上的一个bug。但不管怎样,您希望使用GET

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

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


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

如果您在浏览器中打开了pdf,则在打印之前应该尝试再次将其从服务器上拉下来,除非缓存不是会话过期。您是否尝试过明确告诉浏览器要将带有标题的pdf缓存多长时间?我没有尝试过。我会看看我能做什么…我可能需要重写部分代码。。因为我使用POST是有原因的。我通过POST将大变量传递给PDF生成脚本。GET对于这么大的变量(每个变量只有几千字节)绝对不是一个好工具。