Я не могу не думать, что есть фундаментальный недостаток в обязательном использовании 15-минутного тайм-аута в приложении, которое обычно требует> 15 минут между действиями.
Как бы то ни было, я бы посмотрел на переопределение метода Catalyst::Plugin::Session->delete_session
, чтобы любое содержимое $c->request->body_parameters
было сериализовано и сохранено (предположительно в базе данных) для последующего восстановления. Вы, вероятно, захотите некоторую элементарную проверку аргументов POST, чтобы убедиться, что они соответствуют вашим ожиданиям.
Точно так же, create_session
должен взять на себя ответственность за извлечение этих данных из базы данных и сделать их доступными для исходного действия формы.
Это похоже на грязную ситуацию, и я склонен повторить мое первое предложение ...
UPDATE:
Независимо от того, используете ли вы delete_session
или auto
, остается парадоксальная проблема: вы не можете сохранить эту информацию в сеансе, поскольку событие тайм-аута уничтожит сеанс. Вы должны хранить его где-то более постоянным, чтобы он пережил повторную инициализацию сеанса. Catalyst::Plugin::Session
сам использует Storable , и у вас должно получиться что-то вроде этого:
use Storable;
...
sub auto {
...
unless (...) { #ie don't do this if processing the login action
my $formitems = freeze $c->request->body_parameters;
my $freezer = $rs->update_or_create(
{user => $c->user, formitems => $formitems} );
# Don't quote me on the exact syntax, I don't use DBIx::Class
}
...
my $formitems = $c->request->body_parameters
|| thaw $rs->find({$user => $c->user})->formitems
|| {} ;
# use formitems instead of $c->request->body_parameters from here on in
Основная таблица, вероятно, имеет (пользователь CHAR (x), formitems TEXT) или аналогичный. Возможно, отметка времени, чтобы не было восстановлено ничего слишком устаревшего. Вы также можете сохранить действие, которое вы обрабатывали, чтобы убедиться, что найденные элементы формы принадлежат правильной форме. Вы знаете проблемы для своего приложения лучше меня.