ZF2阻止多表单提交

时间:2014-11-11 09:29:43

标签: php zend-framework2 captcha

ZF2表单中是否有任何方法可以防止多个表单提交?我已使用Captcha函数测试了CSRFisValid()元素,但它们不会阻止多次提交,尤其是那些使用浏览器刷新按钮的提交。 提前致谢

1 个答案:

答案 0 :(得分:5)

是的,有一个名为PRG的控制器插件:

POST / REDIRECT / GET PLUGIN

引用官方zf2文档:

  

当用户发送POST请求时(例如,在提交表单后),他们的   浏览器将尝试保护他们不再发送POST,打破   后退按钮,导致浏览器警告和弹出窗口,有时   重新发布表格。相反,当收到POST时,我们应该存储   会话容器中的数据并将用户重定向到GET   请求。

http://framework.zend.com/manual/2.0/en/modules/zend.mvc.plugins.html#the-post-redirect-get-plugin

用我自己的话说进一步扩展;使用此插件时,每次通过POST提交表单时,POST变量都会存储到SESSION中,并且用户会被重定向到不同的路由或简单的相同路由(刷新)。然后可以通过PRG插件访问Form变量,作为模仿原始POST数组的简单数组。这样可以防止多次发布FORM。

用法(来自ZF2文档):

// Pass in the route/url you want to redirect to after the POST
$prg = $this->prg('/user/register', true);

if ($prg instanceof \Zend\Http\PhpEnvironment\Response) {
    // returned a response to redirect us
    return $prg;
} elseif ($prg === false) {
    // this wasn't a POST request, but there were no params in the flash messenger
    // probably this is the first time the form was loaded
    return array('form' => $myForm);
}

// $prg is an array containing the POST params from the previous request
$form->setData($prg);

// ... your form processing code here