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

问题描述 投票:0回答:4

由于浏览器在Web应用程序中的缓存,我面临问题。

在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,然后将User重定向到给定的Pages和On Web Application它显示了我最近刚刚注销的旧用户名。

在Google Chrome中,我也面临同样的问题。

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

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

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

c# asp.net browser-cache
4个回答
0
投票

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

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

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


0
投票

我认为没有可能实现您的目标,浏览器中的历史记录实际上是您的服务器发送到浏览器的内容的缓存版本。最好的情况是,你可以告诉浏览器使用头文件pragma:no-cache请求没有缓存在服务器上的内容,但它不一定要通过任何方式来尊重它。


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" />

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


0
投票

无论你使用什么标头,一些浏览器似乎总是缓存!

我刚刚提出了我自己正在寻找的解决方案。它一直盯着我。

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

这个解决方案非常简单,只需要很少的专业知识即可实现。

我使用php,但我相信URL变量可以与asp,javascript等等一起使用

您的浏览器将http://example.com/index.phphttp://example.com/index.php?x=32http://example.com/index.php?x=3199视为不同的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变量不同。

不用担心我们永远不必阅读它,它只是“愚弄”浏览器。下次我们访问同一页面时,我们很可能会看到一个非常不同的数字

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

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

现在的答案很简单,我在这里度过了几个星期,没有任何工作能够持续下去。这样做!

© www.soinside.com 2019 - 2024. All rights reserved.