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


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

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


2378
2017-10-16 19:52


起源

更好的是设计您的应用程序,以便后退按钮具有合理的含义。当我'不允许'使用后退按钮时,我发现它真气。 - Peter
彼得,我同意。有时(例如电子商务网站的结账过程),您可能会想要阻止用户返回。但是,我在答案中提出了一个更好的服务器端解决方案。 - Steve Wortham
@Peter,我完全同意,但我正在处理工作流程,所以后退按钮不适用于此处。 - mkoryak


答案:


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

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

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

- 要么 -

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

看起来类似的问题在这里得到了回答:

在POST之后使用303重定向以避免“网页已过期”:如果有多于GET请求可以处理的字节,它是否会起作用?

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


10
2017-10-16 19:59





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

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

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


2
2017-10-16 19:58





尝试在Page_Load中使用以下代码

Response.Cache.SetCacheability(HttpCacheability.Private)

1
2018-03-25 12:56



这是.net具体对吗? - mkoryak
是的,据我所知 - Jeremy


之前使用以下之一 session_start

session_cache_expire(60); // in minutes 

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

/注意:

语言是PHP


1
2018-02-15 07:06



包括哪种语言会有所帮助 - mkoryak


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

BrowserMatch MSIE force-no-vary

根据 RFC

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

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

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


0
2018-03-04 16:55