首页 文章

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

提问于
浏览
5

我目前正面临HTTP post表单和历史pushstate的一个小问题 .

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

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

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

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

2 回答

  • 0

    也许尝试替换replaceState?见this .

    replaceState()方法history.replaceState()与history.pushState()完全相同,只是replaceState()修改当前历史记录条目而不是创建新条目 . 当您想要更新当前历史记录条目的状态对象或URL以响应某些用户操作时,replaceState()特别有用 .

  • 1

    我有一个相同的问题 - 我正在使用历史API与BackboneJS .

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

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

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

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

    • 服务器端重定向

    • JavaScript( location.href="page-2"

    • HTML Headers ( <meta http-equiv="refresh" content="0; URL='http://example.com/page-2'" />

    我个人尝试过选项1和2 - 它们对我来说很好 . 希望这可以帮助!

相关问题