【问题标题】:How can I disable Browser's Cache throughout my web application in asp.net 4.0?如何在 asp.net 4.0 中禁用整个 Web 应用程序中的浏览器缓存?
【发布时间】:2015-01-02 02:18:58
【问题描述】:

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

On LogoutButton Click 我通过以下方式清除 Session 和 Cache。

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 应用程序页面,因为我没有在应用程序中使用缓存,性能对我来说不是问题。

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

【问题讨论】:

  • 你能用代码解释一下吗
  • 允许一点点 JavaScript 吗?当然,您还必须在服务器端做一些事情(使用 Insta 建议的令牌),但至少在客户端您可以自动重定向。尝试类似于此处描述的技术:stackoverflow.com/a/24058288/1207195

标签: c# asp.net browser-cache


【解决方案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 变量不同,浏览器会认为它是不同的页面。

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

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

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

现在的答案是如此简单,我很惊讶我花了数周时间在这上面,但没有任何东西能始终如一地工作。可以!

【讨论】:

  • Bryan Boettcher 完全不需要搞乱会话。事实上,我坚信“滚动你的 owm”可以减少黑客攻击。他们知道现有脚本的漏洞。蒂姆不适用于所有浏览器。对于你们俩来说,我的解决方案适用于所有浏览器
  • No matter what headers you use some browsers seem to always cache! 当您在 aspx 页面顶部使用 &lt;%@ OutputCache NoStore="true" VaryByParam="*" Location="None" %&gt; 时,哪个浏览器会缓存?我什么都不知道?你试过吗?
  • Tim that does not work on all browsers 不,它没有。例如,如果生成相同的随机数,它就不会。解决方案是让服务器正确通知浏览器不要缓存内容。这是 ASP.NET 中成熟的解决方案。
  • 我们不得不这样做。 Chrome 正在缓存重定向链接并使用旧 URL,即使在数据库中有新 URL 后也是如此。我们不得不用额外的数字来欺骗它。每当我们更改我们的核心 javascript 文件时,我们也必须这样做。 +1。
【解决方案2】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 我想在整个应用程序中禁用缓存,以便浏览器无法缓存任何页面,并且用户在从应用程序注销后无论如何都无法查看任何页面。
      • 这是什么意思?发送一个 cookie 以清除 cookie 值。请用代码解释一下。
      猜你喜欢
      • 2010-11-12
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 2018-06-29
      • 2010-09-29
      • 2010-10-29
      • 2016-08-03
      相关资源
      最近更新 更多