在后退按钮上显示“网页已过期”

时间:2009-10-16 19:52:37

标签: http-post

当用户点击后退按钮时,浏览器要求显示无处不在的“此页面已过期”消息的要求是什么?

有哪些用户友好的方法可以阻止用户在网络应用中使用后退按钮?

5 个答案:

答案 0 :(得分:11)

嗯,默认情况下,无论何时处理表单POST,然后用户点击然后刷新,他们都会看到指示浏览器正在重新提交数据的消息。但是如果页面设置为立即过期,那么他们甚至不必点击刷新,当他们回击时他们会看到页面已经过期消息。

要避免这两个消息,有几件事要尝试:

1)使用表格GET代替。这取决于你正在做什么,但这并不总是一个好的解决方案,因为GET请求仍有大小限制。信息在查询字符串中传递,这不是最安全的选项。

- 或 -

2)在表单POST后执行服务器端重定向到其他页面。

这里似乎回答了类似的问题:

Redirect with a 303 after POST to avoid "Webpage has expired": Will it work if there are more bytes than a GET request can handle?

作为第三种选择,可以防止用户回到他们的浏览器中。我唯一觉得有必要这样做是为了防止他们做一些愚蠢的事情,比如付两次钱。虽然有更好的服务器端方法来处理它。如果您的站点使用会话,则可以通过首先在结帐页面上禁用缓存并立即将其设置为过期来阻止他们支付两次。然后你可以利用存储在会话中的某种标志,如果你回到它会实际改变页面的行为。

答案 1 :(得分:2)

您需要在HTTP标头中设置pragma-cache控制选项: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9

然而,从可用性的角度来看,这是对此事的劝阻。我强烈建议您寻找其他选择。

ps:正如史蒂夫提出的那样,通过GET重定向是正确的方法(或用JS检查页面移动)。

答案 2 :(得分:1)

尝试在Page_Load

中使用以下代码
Response.Cache.SetCacheability(HttpCacheability.Private)

答案 3 :(得分:1)

session_start

之前使用以下其中一项
session_cache_expire(60); // in minutes 

ini_set('session.cache_limiter', 'private');

/注意:

语言是PHP

答案 4 :(得分:0)

我不确定这是否是标准做法,但我通常不通过仅为IE发送Vary标头来解决此问题。在Apache中,您可以将以下内容放在httpd.conf中:

BrowserMatch MSIE force-no-vary

根据RFC

  

Vary字段值表示该集合   完全的请求标头字段   确定,而响应是   新鲜的,是否允许缓存   使用响应来回复   后续请求没有   重新验证。

实际效果是当你“回”到POST时,IE只是从历史缓存中获取页面。完全没有请求到服务器端。我可以在HTTPWatch中清楚地看到这一点。

我很想知道这种方法的潜在不良副作用。