2

基本上,当用户在浏览器中单击“返回”(或使用按键控制)时,我正在构建的该站点上的所有页面都无法访问,并且如果尝试返回历史记录,则该页面应该过期。

我放入 Global.asax::Application_BeginRequest

    Response.Cache.SetCacheability(HttpCacheability.NoCache)
    Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1))
    Response.Cache.SetValidUntilExpires(False)
    Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches)
    Response.Cache.SetNoStore()

这将清除缓存并在用户注销时不允许返回任何页面,但在用户登录时不会执行此工作。

我看到人们建议使用 javascript 方法的帖子,通过调用

    History.Forward(1)

在页面上。但我不想这样做,因为它需要启用 javascript 才能工作(用户可以禁用)。

感谢任何建议。

4

2 回答 2

4

您可以始终如一地做到这一点的唯一方法是,如果您使用https. 如果不是,您将无法强制浏览器不使用缓存页面。有你提到的黑客,但它们不是完整的证据。如果它真的很重要,请使用,https因为每个请求都会强制重新加载。

于 2010-03-17T16:27:02.620 回答
0

在花费大量时间进行调查和试验之后,我实施了一种解决方法并决定分享它,以防其他人发现它有用。这种(最接近解决方案,但仅在 Firefox 上除外)解决方法将导致:

  1. IE6 - 8:出现“页面已过期”
  2. Chrome:出现“确认重新提交表单”
  3. Firefox:会出现一个对话框,要求重新发送帖子数据

解决方法:

  1. 使用上面发布的原始问题中列出的 Response.Cache 设置
  2. 将所有指向站点内不同页面的超链接更改为 LinkBut​​ton。
  3. PostBackURLLinkButton链接href URL中设置。这是必要的,因为只有使用POST以及我们设置的标题,浏览器才会使历史记录中最初发布的页面失效并要求重新发送。
  4. 不要在后面的代码中使用 Response.Redirect ,而是使用Server.Transfer,因为Response.Redirect将使用 GET 到另一个页面。

该方案不禁止用户导航回历史页面,而是确认是否再次发布数据。正如原始帖子中提到的History.Forward(1)那样,它的效果不太好,而且我也认识到在没有任何警告的情况下自动重新发布到页面的可能性,本质上会导致向服务器提交多个请求。

主要思想是 POST 到每个页面而不是 GET,因此在站点中访问的每个页面在导航返回时都会屈服于 Page Expired 页面。现在用户可以随时刷新以重新发布数据。

于 2010-03-29T13:41:01.980 回答