history.pushstate和HTTPPOST表单转发



我目前在HTTP post表单和历史推送状态方面遇到了一个小问题。

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

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

有没有办法在popstate更改时清除javascript中以前提交的所有数据,以防止浏览器发出转发提示?还是我的历史状态有所遗漏?还是浏览器目前还没有很好地实现它?

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

也许可以尝试replaceState?看看这个。

replaceState()方法

history.replaceState()的操作与history.pushState()完全相同,不同之处在于replaceState[()]修改当前历史记录条目,而不是创建新的条目。

replaceState()在您希望更新当前历史记录项的状态对象或URL以响应某些用户操作时特别有用。

我有一个相同的问题-我正在使用BackboneJS的History API。

我想到的解决方案是有一个中间页面,表单在登录后重定向到该页面。这个中间页面的目的是在目标页面之前添加一个非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'" />)

就我个人而言,我已经尝试了选项1和2-它们对我来说很好。希望这能有所帮助!

最新更新