如何在asp.net 4.0中的整个Web应用程序中禁用浏览器缓存?

时间:2014-11-05 18:53:31

标签: c# asp.net browser-cache

我因为We Application中的浏览器缓存而面临问题。

On LogoutButton单击我以下列方式清除会话和缓存。

Session.Clear();
Session.RemoveAll();
Session.Abandon();
// Code disables caching by browser.
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
Response.Cache.SetNoStore();
Response.Redirect("LoginPage.aspx", false);

我也禁用了后退按钮。

但如果我访问历史记录,即使在LogOut之后,用户也可以访问所有页面。

在最新版本的FireFox中,我观察到它不允许使用后退按钮,但是当你长按后退按钮时,Firefox会显示你的历史记录意味着上一页,当用户点击它时,它会再次尝试消息当用户点击Try Again Message时,用户被重定向到给定的Pages和On Web Application它显示了我最近刚刚登出的旧用户名。

在谷歌浏览器中,我也面临同样的问题。

我观察到的另一件事是FireFox,当用户点击“再试一次”时。它命中登录页面的Login_ButtonClick方法并提交凭据,这就是用户能够登录的原因。

所以我已经到了这一点,我必须找到一些方法,以便浏览器不会缓存我的Web应用程序页面,因为我没有在应用程序中使用缓存,性能不是我的担忧。

或者如果我能以其他方式做到这一点,请告诉我。

4 个答案:

答案 0 :(得分:0)

如果这是用于身份验证,请停止自己的身份验证并使用表单身份验证。

如果您要继续自己滚动,请在会话中为"会话令牌"设置一个值,只需使用Guid.NewGuid()。将cookie设置为相同的值。在注销代码上,将会话令牌值(在会话中)设置为null。

每个页面请求,将cookie值与会话值进行比较。如果它们不同,请自动将用户注销,并发送cookie以消除cookie值。

答案 1 :(得分:0)

我认为不可能实现您想要做的事情,浏览器中的这段历史实际上是您的服务器发送到浏览器的内容的缓存版本。最好的情况是,你可以告诉浏览器使用头文件pragma:no-cache请求没有缓存在服务器上的内容,但不一定要尊重它

答案 2 :(得分:0)

尝试在HTML中添加标记以防止缓存。有时它有效,有时它不会。我不得不使用服务器和客户端代码的组合来获取不缓存的页面(实际上,当用户点击后退按钮时刷新)。

修改

尝试将这些添加到HTML中的标题中:

<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />

我承认,有点蛮力,但对于某些浏览器,你别无选择,只能使用这种方法。

答案 3 :(得分:-1)

无论您使用某些浏览器的标头,似乎总是可以缓存!

我只是想出了我自己想要的解决方案。一直在盯着我。

这不会阻止浏览器缓存数据,只会阻止在重新加载页面后从缓存中重新读取过时的数据。如果数据是敏感数据并且从不希望将其写入高速缓存,则仍然可以使用这些标头,但是在所有情况下都无法使用。在不必要的应用程序中,我只想避免从浏览器缓存中加载过时的数据。

该解决方案非常简单,几乎不需要什么专业知识即可实施。

我使用php,但我相信URL变量可以与asp,javascript和更多内容一起使用

您的浏览器将http://example.com/index.phphttp://example.com/index.php?x=32http://example.com/index.php?x=3199视为不同的URL,因此它将不会使用上述任何URL作为另一个URL的缓存。

我在PHP中生成一个随机数,您可能可以在ASP中完成

在php中,我使用:

$rand=(rand(1, 99999));

现在我的PHP链接(即使使用有限的PHP也应该很容易理解)

'<a href="http://example.com/index.php?rand='.$rand.'>"

如果页面已经具有URL变量,那么我们会将其添加到任何GET表单或串联的链接中。

如果表单是邮政表单,我们会通过“操作” URL对其进行标记,所以

http://example.com/index.php 

成为

http://example.com/index.php?rand=<?php echo $rand;?>

然后,我不想缓存的任何页面我都只是将这个随机数添加为URL变量。服务器完全不处理该URL变量,我从不获取该编号,也不需要这样做。

http://example.com/index.php?rand=4398 下次我们加载同一页面时,由于rand = URL变量不同,浏览器认为它是不同的页面。

不用担心,我们永远不必阅读它,仅是“愚弄”浏览器。下一个Timne,我们将在同一页面上看到一个非常不同的数字

http://example.com/index.php?rand=55468

或者就您的浏览器而言,即使在我们完全将变量丢弃回服务器的情况下,也不是在同一页面上,这意味着它在您的ASP或PHP中没有任何价值,并且从未用作变量。

现在的答案是如此简单,我很奇怪,我花了数周的时间对此进行了尝试,但始终无法正常工作。这样!