处理缓存和浏览器后退按钮的最佳方法是啥?

Posted

技术标签:

【中文标题】处理缓存和浏览器后退按钮的最佳方法是啥?【英文标题】:What's the best way to deal with cache and the browser back button?处理缓存和浏览器后退按钮的最佳方法是什么? 【发布时间】:2010-09-06 14:09:47 【问题描述】:

处理用户返回到在 asp.net 应用程序中缓存项目的页面的最佳方法是什么?有没有一种捕获后退按钮(事件?)并以这种方式处理缓存的好方法?

【问题讨论】:

见***.com/questions/20088616/… 【参考方案1】:

如果有帮助,您可以尝试使用HttpResponse.Cache property:

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(false);
Response.Cache.VaryByParams["Category"] = true;

if (Response.Cache.VaryByParams["Category"])

   //...

或者可以使用HttpResponse.CacheControl 完全阻止页面缓存,但它已被弃用,取而代之的是上面的 Cache 属性:

Response.CacheControl = "No-Cache";

编辑:或者您真的可以 go nuts 并手动完成所有操作:

Response.ClearHeaders();
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1 
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.1 
Response.AppendHeader("Keep-Alive", "timeout=3, max=993"); // HTTP 1.1 
Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.1 

【讨论】:

【参考方案2】:

据我所知(或至少已阅读)最好不要响应用户事件,而是“在页面中”思考..

设计您的应用程序,这样它就不会关心是否按下了后退按钮。它只会处理它。从开发的角度来看,这可能意味着一些额外的工作,但总体而言会使应用程序变得很多更健壮..

即,如果第 3 步执行了一些数据更改,则用户单击返回(到第 2 步)并再次单击下一步,然后应用程序检查是否已进行更改。或者理想情况下,它不会进行任何 hard 更改,直到用户最后单击“确定”。这样,所有更改都将被存储,您可以根据之前输入的加载值重新填充表单,每次..

我希望这是有道理的:)

【讨论】:

-1 与其说是务实的答案,不如说是一个理想的答案。一些应用程序从一开始就以特定的方式设计,当在预算紧张的大型团队中工作时,将资源投入到改变架构中而没有给业务利益相关者带来任何明显收益的情况下,这将是一件非常困难的事情。除此之外,这并没有真正回答问题。【参考方案3】:

RFC 2616 §13.13 表示历史和缓存是不同的东西。缓存应该绝对不会影响返回按钮。

如果 HTTP 标头的任何组合影响后退按钮,这是浏览器中的一个错误……除了一个例外。

在 HTTPS 中,浏览器将 Cache-control: must-revalidate 解释为使用后退按钮时刷新页面的请求(Mozilla 称之为“傻银行模式”)。这在普通 HTTP 中不受支持。

【讨论】:

【参考方案4】:

处理它的最佳方法可能是在您的 ASP.NET 页面中放置一个 no-cache 指令(或者如果您正在使用一个母版页)。我认为没有办法直接在您的 ASP.NET 代码中处理这个问题(因为缓存决定发生在客户端上)。

至于 MVC,不知道如何实现(假设它不同于基于 Web 窗体的 ASP.NET);我没用过。

【讨论】:

【参考方案5】:

以下代码在 IE9+、FF21 和最新版 Chrome 中适用于我:

Response.Cache.SetCacheability(HttpCacheability.NoCache | HttpCacheability.Private);
Response.Cache.AppendCacheExtension("must-revalidate");
Response.Cache.AppendCacheExtension("max-age=0");
Response.Cache.SetNoStore();

您可以将其放置在 MasterPage 的 Page_Load() 事件处理程序中,以便您的应用中的每个页面在按下后退按钮时都需要往返于服务器。

【讨论】:

以上是关于处理缓存和浏览器后退按钮的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

浏览器后退按钮显示缓存中的页面?

后退按钮(浏览器行为)

使用 Laravel 5.4 时在 Chrome 中防止后退按钮的选项

注销后如何防止浏览器的后退按钮登录

注销后的 CodeIgniter 后退按钮

浏览器后退按钮处理