仅在注销时清除浏览器缓存

时间:2011-07-15 15:24:33

标签: c# asp.net

如何仅在注销时清除浏览器缓存,确定我可以使用以下内容:

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

但是登录和非登录用户都可以访问这个购物袋页面的特定页面。如何设置登录用户能够访问此页面而不清除浏览器缓存但在他/她注销时清除它以便其他用户无法访问访问历史内容。

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

我也在注销时清除了我的会话,但我知道浏览器缓存仍然存在。

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

请指教。感谢。

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

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

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

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

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

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

答案 2 :(得分:0)

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

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);
}

答案 3 :(得分:0)

有办法做到这一点。如果要缓存页面,可以添加vary参数。例如

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

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