当用户点击返回按钮时,浏览器显示无处不在的“此页面已过期”消息的要求是什么?
有哪些用户友好的方法可以防止用户在 web 应用程序中使用后退按钮?
好吧,默认情况下,只要您处理表单 POST,然后用户回击然后刷新,他们就会看到指示浏览器正在重新提交数据的消息。但是如果页面设置为立即过期,那么他们甚至不必点击刷新,他们会在他们回击时看到页面已过期消息。
为了避免这两种消息,有几件事可以尝试:
1) 改用 GET 表单。这取决于您在做什么,但这并不总是一个好的解决方案,因为 GET 请求仍然存在大小限制。并且信息在查询字符串中传递,这不是最安全的选项。
- 或者 -
2) 在表单 POST 之后执行服务器端重定向到不同的页面。
似乎在这里回答了类似的问题:
POST 后使用 303 重定向以避免“网页已过期”:如果字节数超过 GET 请求可以处理的字节数,它会起作用吗?
作为第三种选择,可以完全阻止用户返回他们的浏览器。我唯一一次觉得有必要这样做是为了防止他们做一些愚蠢的事情,比如支付两次。尽管有更好的服务器端方法来处理它。如果您的网站使用会话,那么您可以通过首先禁用结帐页面上的缓存并将其设置为立即过期来防止他们支付两次费用。然后,您可以利用存储在会话中的某种标志,如果您返回它,它实际上会改变页面的行为。
您需要在 HTTP 标头中设置 pragma-cache 控制选项:http: //www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9
但是,从可用性的角度来看,这是不鼓励处理此事的方法。我强烈建议您寻找其他选择。
ps:正如史蒂夫所建议的,通过 GET 重定向是正确的方法(或使用 JS 检查页面移动)。
尝试在 Page_Load 中使用以下代码
Response.Cache.SetCacheability(HttpCacheability.Private)
在之前使用以下之一session_start
:
session_cache_expire(60); // in minutes
ini_set('session.cache_limiter', 'private');
/笔记:
语言是 PHP
我不确定这是否是标准做法,但我通常通过不仅为 IE 发送 Vary 标头来解决此问题。在 Apache 中,您可以在 httpd.conf 中添加以下内容:
BrowserMatch MSIE force-no-vary
根据RFC:
Vary 字段值指示一组请求头字段,当响应是新鲜的时,该字段完全确定是否允许缓存使用响应来回复后续请求而无需重新验证。
实际效果是,当您“返回”到 POST 时,IE 只是从历史缓存中获取页面。根本没有请求到达服务器端。我可以在 HTTPWatch 中清楚地看到这一点。
我很想听听这种方法潜在的不良副作用。