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
在用户开始注意到某种行为之前,一切都很好:
- 他们使用脚本生成 PDF
- 让浏览器闲置一段时间做其他的事情,直到SESSION在幕后过期
- 然后他们使用浏览器的另存为功能来保存 PDF。
我们公司使用的浏览器 (Mozilla) 不是从内存中保存 PDF(PDF 在浏览器中仍然可见),而是向服务器发出请求,请求 PDF 的新副本。但是......这样做时,POST 是空的,因为 POST 没有被重新发送,而 SESSION 是空的,因为 SESSION 在空闲阶段已经过期。
这会导致 PDF 损坏,其中 PDF 实际上是包含 words 的 ASCII 文本文件PDF Must be Regenerated
。直到为时已晚,用户才注意到它。
但是,Mozilla 显然调用了服务器,PHP 脚本通过了用户登录凭据测试,但始终有空的 POST 和 SESSION,导致 PDF 损坏。
登录凭据检查不依赖于 SESSION,老实说,我还不能确定它依赖于什么,因为我无法轻松重现该问题,因此无法轻松测试。
解决方法显然是在 PDF 生成后不久保存 PDF,在 SESSION 过期之前,但用户“永远正确”,我想让用户即使在 SESSION 过期时也能够保存 PDF。我的问题是“如何”。
如何?我能做些什么?