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

3

如何仅在注销时清除浏览器缓存,当然可以使用以下方法:

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个回答

5

我不是c#专家,但我非常确定你上面的内容只告诉浏览器不要缓存你所在的页面。没有办法告诉浏览器清除任何页面的缓存。如果有这样的方法,那就会成为一个问题。听起来你需要的解决方案是不要缓存任何页面,无论是否退出登录。


谢谢您的建议,但您有什么想法应对我提到的情况需要使用哪些技术吗? - k80sg
@Amir 你应该是想说“你无法控制”吧? - James McCormack
是的,抱歉打错了。无法控制。现在已经太晚了,无法编辑。 - Amir Raminfar
对吧?我还是不明白你的问题在哪里。当他们点击结账时重定向。你必须让他们在某个时候登录。亚马逊就是这样做的。他们使用会话来跟踪您的购物车,当您想要结账时,他们会强制您登录。 - Amir Raminfar
如果我没有表达清楚,我向您道歉。"他们使用会话来跟踪您的购物车,当您想要结账时,他们会强制您进行登录。"是的,这也是我的程序正在做的事情,但也许我没有意识到自己做错了什么,因为用户在注销后仍能访问之前的页面并查看购物车历史记录。 - k80sg
显示剩余2条评论

2
也许你混淆了服务器缓存和客户端缓存的区别?
如果你在aspx页面上设置输出缓存,那就是服务器端缓存,并且你有一个场景,.NET可以决定是否发送预缓存内容,仍然应用ACL规则。
如果你使用Response.Cache设置HTTP返回的缓存要求,那就是客户端缓存。一旦浏览器遵循你发送的缓存规则,你下一次撤回缓存规则的机会就只有在浏览器再次请求该页面时。如果你把缓存设置为明天过期,那么这就是你下一次修改缓存的机会。顺便说一句,假设浏览器服从你的指示,但并不保证。
简而言之,动态页面不应尝试设置客户端缓存,如果你希望它们保持动态。实际上,你应该积极使用像你提到的技术,在任何时候都抑制这些页面上的缓存。
客户端缓存真正应该只用于协助处理你网站的静态部分的性能和带宽。

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

0

有一种方法可以实现。如果您正在缓存页面,可以添加一个变量参数。例如:

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

在上面的示例中,如果我传递一个随机变量(例如当前datetime对象的ticks),那将防止缓存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接