仅在登出时清除浏览器缓存

本文关键字:清除 浏览器 缓存 | 更新日期: 2023-09-27 18:02:26

如何在登出时清除浏览器缓存,当然我可以使用以下方法:

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("~/");

请建议。谢谢。

仅在登出时清除浏览器缓存

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

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

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

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

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

客户端缓存应该只用于帮助提高站点静态部分的性能和带宽。

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

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

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

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

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

在上面的例子中,如果我传递一个随机变量,比如当前datetime对象的刻度,这将阻止缓存