Как обойти функцию сохранения браузера после истечения срока действия SESSION?

Создание PDF зависит от $_POST

Я создаю PDF-файл в своем браузере, используя PHP-скрипт, где скрипт, генерирующий PDF-файл, зависит от переменных, отправленных ему через POST. Когда POST пуст, PDF-файл не может быть сгенерирован, и выдается предупреждение о том, что «PDF должен быть сгенерирован повторно».

В некоторых ситуациях массив POST был пустым, а именно, если я нажал кнопку «Обновить» в браузере, находясь на странице с PDF, по какой-либо причине данные POST не отправляются повторно, и нет запроса на повторную отправку, он просто становится пустым и сценарий обнаруживает это и выдает предупреждение. Предупреждение PDF Must be Regenerated, это то, что я вставляю, когда массив POST пуст в моем коде.

Обходной путь создания PDF зависит от $_SESSION

Поэтому обходной путь, который я сделал, - это сохранить данные POST в SESSION, а затем использовать SESSION, когда 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-файл после истечения срока действия SESSION

И все было хорошо, пока пользователи не начали замечать определенное поведение:

  1. Они генерируют PDF с помощью скрипта
  2. Оставьте браузер бездействующим на некоторое время, занимаясь другими делами, пока SESSION не истечет за кулисами.
  3. Затем они используют функцию браузера «Сохранить как», чтобы сохранить PDF.

Браузер, вместо того, чтобы сохранять PDF из памяти (PDF по-прежнему виден внутри браузера), браузер, который использует наша компания (Mozilla), делает запрос на сервер, запрашивая свежую новую копию PDF. Но... при этом POST пуст, потому что POST не отправляется повторно, а SESSION пуст, потому что SESSION истек на этапе простоя.

Это приводит к повреждению PDF, где PDF на самом деле является текстовым файлом ASCII, содержащим слова PDF Must be Regenerated. Пользователи не замечают этого, пока не становится слишком поздно.

Но Mozilla, по-видимому, обращается к серверу, PHP-скрипты проходят проверку учетных данных пользователя, но при этом имеют пустой POST и SESSION, что приводит к повреждению PDF.

Проверка учетных данных для входа не зависит от SESSION, и, честно говоря, я пока не могу сказать, от чего это зависит, потому что я не могу легко воспроизвести проблему, поэтому я не могу легко протестировать.

Обходной путь, очевидно, заключается в сохранении PDF-файла вскоре после его создания, до истечения срока действия SESSION, но пользователь «всегда прав», и я хочу, чтобы пользователь мог сохранить PDF-файл даже после истечения срока действия SESSION. Мой вопрос "как".

Как? Что я могу сделать?


person Dennis    schedule 13.03.2015    source источник
comment
Не похоже, что если у вас был открыт PDF-файл в браузере, он должен попытаться снова извлечь его с сервера перед печатью, если только не истек срок действия КЭША (не сеанса). Вы пытались явно указать браузеру, как долго кэшировать pdf с заголовками?   -  person developerwjk    schedule 14.03.2015
comment
Я этого не пробовал. Я посмотрю что я могу сделать...   -  person Dennis    schedule 14.03.2015


Ответы (1)


PDF-файл кажется ошибкой браузера. но независимо от этого вы хотите использовать GET.

post должен выполнить действие, и браузер правильно не повторяет этот запрос. Из вашего описания не кажется, что просмотр pdf выполняет действие.

если вы используете GET, это означает, что вы получите эти данные с этими параметрами. и браузер будет обрабатывать это соответствующим образом.

если это результат действия, то разбейте действие и отчет на два запроса. например, сделать просмотр итогового отчета в формате PDF ссылкой в ​​ответе на действие. вы можете увидеть эту закономерность, например, когда покупаете кого-то в Интернете. платежный POST-запрос дает вам ссылку через GET на счет.

person gcb    schedule 13.03.2015
comment
Возможно, мне придется переписать части моего кода... потому что я использовал POST по какой-то причине. Я передаю большие переменные через POST скрипту, генерирующему PDF. GET определенно не будет хорошим средством для таких больших переменных, каждая из которых составляет несколько килобайт. - person Dennis; 14.03.2015