通过后退按钮+刷新/重试防止表单重新提交

时间:2015-10-01 22:13:56

标签: javascript jquery html progress-4gl webspeed

如果已经提出这个问题,我很抱歉,但我已经做了很多搜索,但却找不到与我类似的问题。

在我的应用程序中,我有一个密码更改页面,如果某个人是新用户或重置了他/她的密码,则会触发该页面。

问题是,一旦用户进行更改并点击提交,他/她就会被重定向到主页面。现在,如果用户将后退按钮发送几次以进入密码更改页面,则会遇到过期页面,并且可以点击刷新。然后浏览器要求用户重试提交数据。此提交请求是一个POST,用户之前输入的原始数据可以在数据包中看到。

到目前为止,我只能在IE上复制这个问题..但是在FF和Chrome上却没有。但是没有。

我的问题是,有没有办法,使用jQuery,HTML,WSS或其他 - 来阻止重新提交此POST?我最关心的是带有可以看到数据的数据包。

感谢。

1 个答案:

答案 0 :(得分:2)

这类问题的一般解决方案是Post / Redirect / Get-pattern。

这意味着当你想对后台更新内容的页面进行POST时,你真的会创建两个目标页面:

第1页

POST的目标页面。包含更新数据库/文件系统/ API或需要完成的任何操作的逻辑。这只是一个没有任何真实视觉反馈的URL,而是在逻辑完成后将其重定向到第2页(见下文)。重定向是一个简单的GET而不是POST。

第2页

一个页面,显示您对“第1页”的操作的反馈。可能只是一条消息“密码更新确定”或数据库中的实际数据或任何适合您的数据。

现在当有人使用您的表单时,他们会发布到执行后台操作的第1页,然后将它们重定向到第2页。

现在,如果他们重新加载,他们不会重做整个逻辑部分而只重做反馈部分。

维基百科对此有一个很好的解释:

https://en.wikipedia.org/wiki/Post/Redirect/Get

如何在Progress WebSpeed中重定向

在你的outputHeader程序或你做过的地方

output-content-type ("text/html":U).

相反,如果output-content-type:首先执行你的逻辑然后插入这样的东西:

OUTPUT-HTTP-HEADER("Status", "301").
OUTPUT-HTTP-HEADER("Location","http://www.yoursite.com/newurl").
OUTPUT-HTTP-HEADER("","").

现在,一旦逻辑处理完毕,您将被服务器端重定向。如果需要,您还可以在网址中插入参数:

DEFINE VARIABLE iId as INTEGER NO-UNDO.
OUTPUT-HTTP-HEADER("Status", "301").
OUTPUT-HTTP-HEADER("Location","http://www.yoursite.com/newurl?id=" + STRING(iId)).
OUTPUT-HTTP-HEADER("","").