如何仅在注销时清除浏览器缓存,确定我可以使用以下内容:
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("~/");
请指教。感谢。
答案 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)
{
...
}
在上面的示例中,如果我传递一个随机变量,如当前日期时间对象的刻度,则会阻止缓存。