history.pushstate和HTTP POST表单重新发布

时间:2012-11-30 16:58:36

标签: forms http-post page-refresh pushstate html5-history

我目前在HTTP帖子表格和历史记录状态方面遇到了一些问题。

当我的用户在example.com/page-1中提交POST表单然后点击此页面中的链接时,会将其重定向到带有history.pushstate的example.com/page-2。 JS脚本只是更改当前URL,将旧的推送到历史记录,然后显示新内容。这对我来说非常好。

问题:一旦用户在example.com/page-2并且手动刷新页面(ctrl + r或刷新按钮),Chromes会提示用户再次提交表单;但表格实际上在example.com/page-1,并且没有理由在这个“新”页面再次询问。

有没有办法在popstate更改中清除javascript中所有以前提交的数据,以防止从浏览器重新发送提示?或者我错过了我的历史状态?或者它目前还没有被浏览器实现?

我只用chrome测试过,因为我没有在其他浏览器上实现pushstate。

2 个答案:

答案 0 :(得分:1)

也许尝试替换replaceState?请参阅this

  

replaceState()方法

     

history.replaceState()与history.pushState()完全相同,只是replaceState()修改当前历史记录条目而不是创建新条目。

     当您想要更新当前历史记录条目的状态对象或URL以响应某些用户操作时,

replaceState()特别有用。

答案 1 :(得分:0)

我有一个相同的问题 - 我使用历史记录API和BackboneJS

我想到的解决方案是在登录后有一个表单重定向到的中间页面。此中间页面的目的是在目标页面之前添加一个非POST页面,以便浏览器不会提示重新提交表单(以及Chrome不添加冗余条目)。

对于您的示例,在example.com/page-1中提交POST表单后,服务器应将用户重定向到example.com/page-1a

example.com/page-1a可以验证用户凭据是否存在,然后重定向到example.com/page-2。我相信这会解决你的问题。

对于重定向机制,我可以想到3个选项:

  1. 服务器端重定向
  2. JavaScript(location.href="page-2"
  3. HTML标题(<meta http-equiv="refresh" content="0; URL='http://example.com/page-2'" />
  4. 就我个人而言,我已尝试过选项1和2 - 它们对我来说很好。希望这有帮助!