【问题标题】:How to disable browser from regenerating my form data upon pressing back button如何在按下后退按钮时禁用浏览器重新生成我的表单数据
【发布时间】:2013-10-27 06:06:37
【问题描述】:

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

我检查了所有的标头,例如 no-cache 和 must-revalidate ,但仍然发生同样的情况。

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

我知道我的问题有一个完美的解决方案,因为许多 Web 应用程序都这样做。我想知道大公司是怎么做的。必须有一个标准的方法,它可以像魅力一样发挥作用。

PS:使用 Javascript 不是一个选项。也许使用 JS,我可以做一些事情来阻止加载,但我不想这样做,因为很多用户可能已经禁用了 JS。我也不想禁用浏览器的后退按钮和刷新功能,某些应用程序会这样做。

【问题讨论】:

  • 如何提交登录表单?使用 GET 还是 POST?使用 POST 时,浏览器通常会询问是否可以重新发布表单数据。

标签: php cookies browser-cache browser-history cache-control


【解决方案1】:

我想,只有当用户登录时才会发生这种情况,并且在登录后他点击注销。然后,当您在浏览器中按下返回按钮时,会发送带有 $_POST 数据的表单,浏览器会询问您是否要再次发送该表单。我对吗?你是这个意思吗?

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

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

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

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

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

【讨论】:

  • 嗯,你所说的正是正在发生的事情。但是,该解决方案没有奏效。它仍然加载最后一页。
  • 当然你需要在另一个html输出到页面之前使用header。在处理用户记录的数据后,将其存储在会话中,添加 2 行,f.e.主页位置:header('Location: /');
  • 嘿抱歉....它就像我问的那样很有魅力...谢谢哥们...它解决了这个问题。现在你能解释一下为什么会这样吗?
  • 我的解决方案是有效的,因为当你重定向到 f.e.主页,$_POST 被清除,因为您通常会加载另一个页面。
  • 呵呵……这么简单……但是为什么我用302,我不能简单地重定向吗?
【解决方案2】:

1) 使用 POST 进行表单数据传输 2) 在服务器端处理完 POST 数据后,向客户端发送302 Moved 响应,强制其离开 POST 并将其定向到 GET 登录页面。

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

【讨论】:

    猜你喜欢
    • 2011-04-06
    • 1970-01-01
    • 2011-08-06
    • 2010-10-31
    • 2017-01-18
    • 1970-01-01
    • 2014-04-09
    相关资源
    最近更新 更多