2009-10-16 90 views
10

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

什么是一些用户友好的方法来防止用户使用webapp中的后退按钮?

+4

更好地将设计您的应用程序,以便后退按钮具有明智的意义。当我'不允许'使用后退按钮时,我觉得它很生气。 – Peter 2009-10-16 20:18:58

+0

彼得,我同意。有时您可能会试图阻止用户返回,因此有时(例如电子商务网站的结帐流程)。但是,我的答案中提出了一个更好的服务器端解决方案。 – 2009-10-16 20:36:24

+0

@Peter,我完全同意,但我正在处理工作流程,所以后退按钮不适用于此。 – mkoryak 2009-10-19 02:19:53

回答

9

嗯,默认情况下,当你处理表单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?

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

2

你需要在HTTP头设置编译缓存控制选项: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9

然而,从可用性的角度来看,这是不鼓励的做法此事。我强烈建议你去寻找其他的选择。

ps:正如Steve提议的那样,通过GET重定向是正确的方式(或者用JS检查页面移动)。

0

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

BrowserMatch MSIE force-no-vary 

按照RFC

的因人而异字段值指示充分 确定请求头字段的集合 ,而响应为 新鲜,是否允许高速缓存为 使用响应来回复 后续请求而不使用 重新验证。

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

我会很有兴趣听到这种方法的潜在不良副作用。

1

尝试使用下面的代码在Page_Load

Response.Cache.SetCacheability(HttpCacheability.Private) 
+0

这是.net特定的权利? – mkoryak 2011-03-26 00:56:55

+0

是的,据我所知 – Jeremy 2011-04-11 11:47:50

1

使用下列前session_start之一:

session_cache_expire(60); // in minutes 

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

/注:

语言是PHP

+0

包括这是什么语言会有帮助 – mkoryak 2012-02-15 16:17:51