为了帮助可能在会话超时之前保持表单打开的用户,我试图在他们通过登录页面发送并重定向回表单后重新提交他们的表单。该网站有几十个表单,所以我希望将其设为通用并应用于父表单,以便他们都能获得此功能。
目前,如果他们尝试提交表单但未找到身份验证(即会话超时或出于测试目的,我已通过另一个选项卡注销),他们将被发送到保留 post 参数和引用 URL 的登录页面,如下所示:
$this->getUser()->setAttribute('referer', $this->getRequest()->getUri());
$this->getUser()->setAttribute('postparameters', $this->getRequest()->getPostParameters());
然后,如果他们成功登录,他们将被重定向到 URL
$this->redirect($this->getUser()->getAttribute('referer', '@homepage'));
我无法在此处恢复 post 参数,因为它是重定向并导致 http GET 请求。因此,我已将此代码放入将要处理表单的操作中
$postparams = $this->getUser()->getAttribute('postparameters');
if (is_array($postparams))
{
foreach($postparams as $key => $postparam)
{
$request->setParameter($key, $postparam);
}
}
但是,post 参数包含上一个会话中的 _csrf_token,并且表单验证失败。如果我从 $postparams 数组中删除该项目,则表单将被拒绝,因为需要令牌。我不想完全禁用 CSRF 保护,但我找不到解决方法。