为什么在注销后单击页面上的后退按钮会显示上一页内容?

我正在开发一个Struts 2项目。 当用户单击logout按钮时, logout操作会使用session.clear()清除会话。 但是,当用户在注销后单击浏览器中的back按钮时,它仍会显示上一页内容。 如果在注销后在浏览器中单击back按钮,我想将用户重定向到登录页面。

在我的注销行动中还有什么我应该清楚解决这个问题吗? 任何帮助将不胜感激。

事实certificate,在按下后退按钮之前,您的浏览器正在缓存页面。 浏览器缓存机制旨在通过从页面具有相同URL获取本地缓存中的页面来最小化服务器访问时间。 它可以显着减少数千个客户端浏览服务器时的服务器负载,并且似乎非常有用。 但在某些情况下,特别是在您的情况下,内容应该更新。 后退按钮的设计使其可以缓存用户正在浏览的每个页面,并在按下后退按钮时从本地缓存中检索它们。 因此,解决方案是在返回带有控制浏览器缓存的特殊标头的响应时告诉浏览器不允许缓存。 在servlet环境中,您可以使用filter来关闭缓存,但在Struts2中,您可以使用自定义拦截器。 例如

 public class CacheInterceptor implements Interceptor { private static final long serialVersionUID = 1L; @Override public void destroy() {} @Override public void init() {} @Override public String intercept(ActionInvocation invoication) throws Exception { HttpServletRessponse response = ServletActionContext.getResponse(); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setHeader("Expires", "-1"); return invoication.invoke(); } } 

现在您可以配置此拦截器以供每个操作使用

           

当您的包扩展default包时,它们会inheritance拦截器和拦截器堆栈,您也可以通过操作配置覆盖此配置。

这是因为您的浏览器缓存了客户端上的页面。

解决方案是通过强制浏览器甚至在按下“返回”按钮时请求新页面来阻止该页面的缓存,而不是读取保存的页面。

必读:

  • 注销后阻止用户返回上一个安全页面
  • 确保所有浏览器都不会缓存网页

我真的不知道struts。 但尝试可能是在您需要登录的站点上停用缓存。

您还可以在注销function中保存cookie或其他内容,主页检查是否已设置此cookie。 如果它是你可以用JS重新加载页面(当然然后取消设置cookie)。