【问题标题】:Clear browser cache only on logout仅在注销时清除浏览器缓存
【发布时间】:2011-07-15 15:24:32
【问题描述】:

我怎样才能只在注销时清除浏览器缓存,确保我可以使用以下内容:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
Response.Cache.SetNoStore();

但是,登录和未登录用户都可以访问这个购物袋页面。我该如何设置它,使登录用户能够在不清除浏览器缓存的情况下访问此页面,但 Only 在他/她注销时将其清除,这样其他用户将无法访问访问历史内容。

我在这里尝试了解决方案: http://www.codeproject.com/Tips/135121/Browser-back-button-issue-after-logout 进行了一些更改,但仍然无法弄清楚如何处理此问题。

我还在注销时清除了我的会话,如下所示,但我知道浏览器缓存仍将保留。

FormsAuthentication.SignOut();
Session.Abandon();
Response.Redirect("~/");

请指教。谢谢。

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    我不是 c# 专家,但我很确定您上面的内容只会告诉浏览器不要缓存您所在的页面。没有办法告诉浏览器清除任何页面上的缓存。如果有这样的方法,这将是一个问题。听起来您需要的解决方案是根本不缓存任何页面,无论是否注销。

    【讨论】:

    • 感谢您的建议,但您知道我应该使用哪种技术来处理我提到的情况吗?
    • 您可以控制浏览器的功能!缓存的东西只是浏览器应该做什么的提示。我可以制作一个可以缓存所有内容的浏览器。我认为解决方案是只允许登录用户访问产品页面,而未登录用户被重定向。然后当然不要缓存任何东西。有多少网站这样做。
    • @Amir 认为你的意思是“你无法控制”?
    • 是的,抱歉打错了。无法控制。来不及修改。
    • 我无法重定向未登录的用户,因为他们也需要访问购物车页面,即使没有注册,他们也可以将东西放入购物车。
    【解决方案2】:

    也许您对服务器和客户端缓存之间的区别感到困惑?

    如果您在您的 aspx 页面上设置 output cache,这就是服务器端缓存,并且您有一个场景,即 .NET 可以决定是否发送预缓存的内容,并且仍然应用 ACL 规则。

    如果您在使用Response.Cache 返回的 HTTP 上设置缓存要求,那就是客户端缓存。一旦浏览器遵守您在此处发送的缓存规则,您将不得不撤回缓存规则的唯一机会是下次浏览器请求该页面时。如果您将缓存设置为明天到期,那是您下一次修改缓存的机会。顺便说一句,假设浏览器会服从你,这并不能保证。

    简而言之,如果您希望动态页面保持动态,则不应尝试设置客户端缓存。事实上,您应该积极使用您提到的技术来始终抑制这些页面上的缓存。

    客户端缓存实际上应该只用于帮助您网站静态部分的性能和带宽。

    【讨论】:

      【解决方案3】:

      我正在尝试自己解决类似的问题。这只是推测,但如果我可以在我的请求中跟踪用户特定的标头,我将尝试使用

      HttpContext.Current.Response.Cache.VaryByHeaders["login"] = true;
      

      在 global.asax 中

      public override string GetVaryByCustomString(HttpContext context, string arg)
      {
          if (arg == "login")
          {
              return User().Name;
          }
          return base.GetVaryByCustomString(context, arg);
      }
      

      【讨论】:

        【解决方案4】:

        有办法做到这一点。如果您正在缓存页面,您可以添加一个可变参数。例如

        [OutputCache(Duration = 60, Location = System.Web.UI.OutputCacheLocation.Client, VaryByParam = "random")]
        [CompressFilter]
        public ActionResult Page(PageModel model)
        {
              ...
        }
        

        在上面的例子中,如果我传递一个随机变量,比如当前日期时间对象的刻度,那将阻止缓存。

        【讨论】:

          猜你喜欢
          • 2010-11-02
          • 1970-01-01
          • 2012-07-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-16
          • 1970-01-01
          相关资源
          最近更新 更多