2011-10-09 93 views
4

我有一个隐藏的参数,称为“行为”,应按下提交按钮,通过值'load','save'之一。F5(刷新)作为提交

问题是当按下提交按钮后按下F5(刷新)按钮,因为url已经包含'& act = save',因此在F5上实际上实际上将'save'值传递给(cgi)再次执行保存操作,即使我没有按提交按钮。

的queston是如何防止发送“&行为=保存”上按下按钮reffresh?

感谢


谢谢大家,除了提交按钮是一个'保存'按钮 - 意味着我希望让用户能够执行额外保存,所以不要离开页面。 由于这个原因,我不认为会话可能有助于区分第二次保存或第一次刷新。

回答

2

你真的不能防止用户按F5 防止页面重新加载从重新提交的表格 - 即使使用形式POST方法将允许用户重新发送数据。

两个共同的东西来克服这个:

  1. 使用会话变量,设置它的第一个表单提交,然后检查它 - 如果存在,就意味着已经提交,以便忽略它或发布自定义表单信息。

  2. 成功提交后,将用户重定向到不同的页面 - 这种方式点击F5将重新加载该新页面,并且不会重新发送数据。

+0

只能重定向会工作,如果是真的会重要会到期,所以如果然后按F5 –

+0

@Simon好点,但我相信在OP的userleaves在这里是指点击F5的时候了。如果用户按下“后退”按钮,即使重定向也不起作用 - 不能有100%的保护。 –

+0

是否有一种简单的方法来捕捉刷新事件并更改参数'act'的值? – Mike

6

这里的核心问题是您在使用POST时应该使用POST。 The HTTP specification says

特别是,该惯例已经确定GET和HEAD方法不应该具有采取检索以外的其他行为的意义。

如果您使用POST,那么浏览器至少会警告您重新提交表单。

要避免这种情况,请使用POST-Redirect-GET pattern

+0

谢谢,我将它改为发布。正如你所说,现在浏览器至少会提醒我重新提交表单。 – Mike

0

比已经提供的解决方案更复杂的解决方案是每次生成带有表单的页面时创建操作令牌。这个动作令牌存储在服务器上并发送给客户端。当客户提交表单时,它包含动作令牌。当服务器收到表单提交时,它会根据存储在该用户会话中的令牌或令牌来检查动作令牌。如果它与未过期的令牌匹配,则它允许表单处理继续并在会话中使令牌过期。

这样可以防止表单被多次提交,并且还有一个好处,即如果执行得当,它可以帮助减轻跨站请求伪造。