基本上,当用户点击浏览器中的“返回”(或使用密钥控件)时,无法访问我正在构建的此站点上的所有页面,如果有人试图在历史记录中导航,则页面将过期。
我放入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(哪个用户可以禁用)。
感谢任何建议。
答案 0 :(得分:4)
您可以始终如一地执行此操作的唯一方法是使用https
。如果不是,您无法强制浏览器不使用缓存页面。有你提到过的黑客攻击,但它们并不完整。如果它非常重要,请使用https
,因为每个请求都会强制重新加载。
答案 1 :(得分:0)
经过大量时间花在调查和试验上,我已经实施了一种解决方法,并决定分享它以防其他人可能发现它有用。这(最接近解决方案,但只有Firefox上的例外)解决方法将导致:
解决方法:强>
PostBackURL
中的LinkButton
设置为链接href URL。这是必要的,因为只有POST和我们设置的标题,浏览器才会使历史记录中的原始页面到期并要求重新发送。Server.Transfer
,因为Response.Redirect
会将GET用于其他页面。此解决方案不禁止用户导航回历史记录中的页面,而是禁止用户确认是否再次发布数据。如原始帖子中所述,History.Forward(1)
不能很好地工作,我也认识到在没有任何警告的情况下自动重新发布到页面的可能性,实际上会导致向服务器提交多个请求。
主要思想是POST到每个页面而不是GET,因此在导航回来时,站点中访问的每个页面都会屈服于Page Expired页面。现在,用户可以随时刷新以重新发布数据。