繁体   English   中英

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

[英]How can I disable Browser's Cache throughout my web application in asp.net 4.0?

由于We Application中浏览器的缓存,我遇到了问题。

在LogoutButton上,单击I以以下方式清除会话和缓存。

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

而且我也禁用了后退按钮。

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

在最新版本的FireFox中,我观察到它不允许使用“后退”按钮,但是当您长按“后退”按钮时,Firefox会向您显示“历史记录”,即“上一页”,当用户单击它时,它会显示一些重试消息,而“当用户单击时”单击“重试消息”,然后将用户重定向到给定的页面,然后在Web应用程序上显示“旧用户名”,我最近刚刚注销了该用户名。

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

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

因此,我到了这一点,我必须找到某种方法,以使浏览器不会缓存我的Web应用程序页面,因为我没有在应用程序中使用缓存,而性能也不是我关心的问题。

或者,如果我可以通过其他方式执行此操作,请告诉我。

如果这是为了进行身份验证,请停止自己滚动并使用“表单身份验证”。

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

每个单页请求都将cookie值与会话值进行比较。 如果它们不同,则自动注销用户,并发送一个cookie来也清除cookie值。

我认为无法实现您想要的目标,浏览器中的此历史记录实际上是服务器发送到浏览器的内容的缓存版本。 充其量,您可以告诉浏览器使用标头pragma:no-cache来请求未缓存在服务器上的内容,但它不以任何方式接受它

尝试将标签添加到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" />

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

无论您使用什么标题,某些浏览器似乎总是缓存!

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

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

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

我使用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变量不同,浏览器认为它是不同的页面。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM