F5(刷新)作为提交
Posted
技术标签:
【中文标题】F5(刷新)作为提交【英文标题】:F5 (refresh) act as submit 【发布时间】:2011-12-03 20:45:03 【问题描述】:我有一个名为“act”的隐藏参数,它应该在按下提交按钮时传递值“load”、“save”之一。
问题是在按下提交按钮后按下 F5(刷新)按钮时,因为 url 已经包含“&act=save”,所以在 F5 上按下实际上再次传递(到 cgi)“保存”值(并且它执行即使我没有按下提交按钮,也会再次执行保存操作。
问题是如何防止在按下刷新按钮时发送“&act=save”?
谢谢
谢谢大家,但提交按钮是一个“保存”按钮 - 意味着我希望让用户能够执行附加保存,所以不要离开页面。 由于这个原因,我不认为会话可能有助于区分第二次保存或第一次刷新。
【问题讨论】:
【参考方案1】:比已经提供的更复杂的解决方案是在每次生成带有表单的页面时创建一个操作令牌。此操作令牌存储在服务器上并发送到客户端。当客户端提交表单时,它包含操作令牌。当服务器收到表单提交时,它会根据存储在该用户会话中的一个或多个令牌检查操作令牌。如果它匹配一个未过期的令牌,那么它允许表单处理继续,并使会话中的令牌过期。
这可以防止表单被多次提交,并且还有一个附带好处,即如果实施得当,它可以帮助减少跨站点请求伪造。
【讨论】:
【参考方案2】:这里的核心问题是,当你应该使用 POST 时,你却使用了 GET。 The HTTP specification says:
特别是,已经建立了约定,即 GET 和 HEAD 方法不应具有采取除检索之外的操作的意义。
如果您使用的是 POST,那么浏览器至少会警告您重新提交表单。
为了避免这种情况,请使用POST-Redirect-GET pattern。
【讨论】:
谢谢,我改成post了。正如你所说,现在浏览器至少会警告我重新提交表单......【参考方案3】:您不能真正阻止用户按下 F5 或阻止重新加载页面重新提交表单 - 即使在表单中使用 POST
方法也将允许用户重新发送数据。
解决这个问题的两个常见方法:
使用 Session 变量,在第一次提交表单时设置它,然后检查它 - 如果存在,则表示表单已经提交,所以忽略它或发布自定义消息。
成功提交后,将用户重定向到不同的页面 - 这样点击 F5 将重新加载该新页面并且不会重新发送数据。
【讨论】:
只有在非常重要的情况下重定向才会起作用,因为会话将过期,所以如果用户离开它然后按 F5 @Simon 好点,但我认为这里的 OP 意味着立即单击 F5。如果用户按下后退按钮,即使重定向也不起作用 - 无法获得 100% 的保护。 难道没有简单的方法来捕捉刷新事件并改变参数'act'的值吗?以上是关于F5(刷新)作为提交的主要内容,如果未能解决你的问题,请参考以下文章