代码之家  ›  专栏  ›  技术社区  ›  Rash

如何禁用浏览器在按下后退按钮时重新生成我的表单数据

  •  0
  • Rash  · 技术社区  · 11 年前

    我有一个允许用户登录的网络应用程序。当用户单击注销按钮时,我将取消设置所有POST变量,并清除所有包含会话的cookie。然而,当我按下后退按钮时,所有POST变量仍然存在,最后登录的页面仍然出现,并且在用户cookie中生成了一个新的会话。

    我已经检查了所有的头,比如没有缓存,必须重新验证,但仍然会发生同样的情况。

    POST数据仍然存在,这表明页面正在从“浏览器历史记录”加载。

    我知道有一个完美的解决方案可以解决我的问题,因为许多网络应用程序都是这样做的。我想知道大公司是如何做到这一点的。必须有一种标准的方式,才能像魅力一样发挥作用。

    附言:使用Javascript不是一种选择。也许有了JS,我可以做一些事情来防止加载,但我不想这样做,因为很多用户可能已经禁用了JS。我也不想像一些应用程序那样禁用后退按钮和刷新浏览器的功能。

    2 回复  |  直到 11 年前
        1
  •  1
  •   Legionar    11 年前

    我想,只有当用户登录时才会发生这种情况,并且在登录后立即单击注销。然后,当你按下浏览器中的后退按钮时,会有一个发送表单,其中包含他的日志记录的$_POST数据,浏览器会询问你是否要再次发送该表单。我说得对吗?你是这个意思吗?

    如果是,则使用此解决方案以避免再次发送表单(当单击后退按钮或按下F5(刷新)时):

    当您处理带有登录数据的表单时,请重定向到同一页面或主页(由您决定)。使用

    header("HTTP/1.1 302 Found");
    header('Location: '.$url_to_redirect);
    

    然后,当他点击返回按钮或刷新页面时,它不会再次发送登录数据,因此不会将他重新登录。

    如果还有其他原因,请发表评论,我会解释更多。

        2
  •  1
  •   ErnestV    11 年前

    1) 使用POST进行表单数据传输 2) 在服务器端处理POSTed数据后,发送 302 Moved 对客户端迫使其离开POST并将其引导到GET登录页的响应。

    这应该是处理表单提交的一般方法,有效地禁止重新发布表单数据。无法使用GET表单完成-但是很少需要保护的GET表单。。。