ASP.Net:导航回来时页面到期

时间:2010-03-17 16:05:42

标签: asp.net browser caching postback browser-history

基本上,当用户点击浏览器中的“返回”(或使用密钥控件)时,无法访问我正在构建的此站点上的所有页面,如果有人试图在历史记录中导航,则页面将过期。

我放入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(哪个用户可以禁用)。

感谢任何建议。

2 个答案:

答案 0 :(得分:4)

您可以始终如一地执行此操作的唯一方法是使用https。如果不是,您无法强制浏览器不使用缓存页面。有你提到过的黑客攻击,但它们并不完整。如果它非常重要,请使用https,因为每个请求都会强制重新加载。

答案 1 :(得分:0)

经过大量时间花在调查和试验上,我已经实施了一种解决方法,并决定分享它以防其他人可能发现它有用。这(最接近解决方案,但只有Firefox上的例外)解决方法将导致:

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

    1. 使用上面发布的原始问题中列出的Response.Cache设置
    2. 将站点内不同页面的所有超链接更改为LinkBut​​ton。
    3. PostBackURL中的LinkButton设置为链接href URL。这是必要的,因为只有POST和我们设置的标题,浏览器才会使历史记录中的原始页面到期并要求重新发送。
    4. 不使用后面代码中的Response.Redirect,而是使用Server.Transfer,因为Response.Redirect会将GET用于其他页面。
    5. 此解决方案不禁止用户导航回历史记录中的页面,而是禁止用户确认是否再次发布数据。如原始帖子中所述,History.Forward(1)不能很好地工作,我也认识到在没有任何警告的情况下自动重新发布到页面的可能性,实际上会导致向服务器提交多个请求。

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