避免JSF web应用程序上的后退按钮

避免JSF web应用程序上的后退按钮,jsf,browser,back-button,Jsf,Browser,Back Button,我正在展示非常敏感的数据。在用户从我的服务器注销后,我不希望其他用户能够通过点击浏览器的后退按钮看到数据 如何实现这一点?默认情况下,浏览器的“后退”按钮根本不会向服务器发送HTTP请求。相反,它从浏览器缓存中检索页面。这本质上是无害的,但对最终用户来说确实是令人困惑的,因为他/她错误地认为它确实来自服务器 您只需指示浏览器不要缓存受限制的页面。您可以通过一个简单的servlet过滤器来实现这一点,该过滤器设置: (请注意,此筛选器跳过JSF资源请求,) 要使其在每个JSF请求上运行,请在过滤器

我正在展示非常敏感的数据。在用户从我的服务器注销后,我不希望其他用户能够通过点击浏览器的后退按钮看到数据


如何实现这一点?

默认情况下,浏览器的“后退”按钮根本不会向服务器发送HTTP请求。相反,它从浏览器缓存中检索页面。这本质上是无害的,但对最终用户来说确实是令人困惑的,因为他/她错误地认为它确实来自服务器

您只需指示浏览器不要缓存受限制的页面。您可以通过一个简单的servlet过滤器来实现这一点,该过滤器设置:

(请注意,此筛选器跳过JSF资源请求,)

要使其在每个JSF请求上运行,请在过滤器类上设置以下注释,假设您的web应用程序的
web.xml
FacesServlet
值为
FacesServlet

@WebFilter(servletNames={"facesServlet"})
或者,要使其仅在特定的URL模式上运行,例如匹配受限页面的模式,例如
/app/*
/private/*
/secured/*
,等等,请在筛选器类上设置以下注释:

@WebFilter("/app/*")
你甚至可以在一个过滤器中做同样的工作来检查登录的用户,如果你已经有一个用户的话

若您碰巧使用了JSF实用程序库,那个么您也可以直接获取它。这也透明地考虑了JSF资源

另见:

默认情况下,浏览器的后退按钮根本不会向服务器发送HTTP请求。相反,它从浏览器缓存中检索页面。这本质上是无害的,但对最终用户来说确实是令人困惑的,因为他/她错误地认为它确实来自服务器

您只需指示浏览器不要缓存受限制的页面。您可以通过一个简单的servlet过滤器来实现这一点,该过滤器设置:

(请注意,此筛选器跳过JSF资源请求,)

要使其在每个JSF请求上运行,请在过滤器类上设置以下注释,假设您的web应用程序的
web.xml
FacesServlet
值为
FacesServlet

@WebFilter(servletNames={"facesServlet"})
或者,要使其仅在特定的URL模式上运行,例如匹配受限页面的模式,例如
/app/*
/private/*
/secured/*
,等等,请在筛选器类上设置以下注释:

@WebFilter("/app/*")
你甚至可以在一个过滤器中做同样的工作来检查登录的用户,如果你已经有一个用户的话

若您碰巧使用了JSF实用程序库,那个么您也可以直接获取它。这也透明地考虑了JSF资源

另见:

我还找到了另一个好办法

在faces-config.xml中添加

<lifecycle>
    <phase-listener id="nocache">client.security.CacheControlPhaseListener</phase-listener>
</lifecycle>

我还找到了另一个好办法

在faces-config.xml中添加

<lifecycle>
    <phase-listener id="nocache">client.security.CacheControlPhaseListener</phase-listener>
</lifecycle>

虽然这可能会起作用,但使用JSF阶段侦听器,同时使用servlet过滤器也可以实现相同的功能,就像使用锤子而不是螺丝刀来拧紧螺钉一样。你是什么意思?“虽然这可能会起作用,但使用JSF阶段侦听器,同时使用servlet过滤器也可以实现相同的功能,就像使用锤子而不是螺丝刀来拧紧螺钉一样。”虽然这可能会起作用,使用JSF阶段侦听器,而servlet过滤器也可以使用相同的功能,就像使用锤子而不是螺丝刀来拧紧螺钉一样。你是什么意思?“虽然这可能会起作用,但使用JSF阶段侦听器,同时使用servlet过滤器也可以实现相同的功能,就像使用锤子而不是螺丝刀来拧紧螺钉一样。”我尝试过这一点——当我在调试器中运行它时,它会在页面加载时停止在noCacheFilter:doFilter方法中。然后,当我在Firefox中单击后退按钮(在本地测试)时,它会再次运行该函数。但最后显示的是上一页。我应该注意什么?Firefox中发生的另一个错误是,每隔三次左右你点击后退,它就会告诉你页面已经过期。当你点击“重新加载”按钮(由错误页面提供)时,它仍然会加载上一页。我知道这种老问题,但是,这对Chrome不起作用。在chrome中单击“后退”按钮时,您仍然可以看到表单字段输入的值。@bluelabel:您要查找的关键字是“自动填充”。另见a.o.@Talib:它们都指的是完全相同的对象。它是Java,一种面向对象的语言,而不是PHP或其他语言。如果它对您不起作用,则可能是这些标题在稍后被覆盖,或者旧页面仍在浏览器缓存中,或者您只是错误地观察了后退按钮的行为(即,它确实击中了服务器,但服务器端代码中又出现了一些bug,使其看起来像缓存)。在一个完全空白的web应用程序中,上面的答案是有效的。我已经尝试过了——当我在调试器中运行它时,它会在页面加载时停止在noCacheFilter:doFilter方法中。然后,当我在Firefox中单击后退按钮(在本地测试)时,它会再次运行该函数。但最后显示的是上一页。我应该注意什么?Firefox中发生的另一个错误是,每隔三次左右你点击后退,它就会告诉你页面已经过期。当你点击“重新加载”按钮(由错误页面提供)时,它仍然会加载上一页。我知道这种老问题,但是,这对Chrome不起作用。在chrome中单击“后退”按钮时,您仍然可以看到表单字段输入的值。@bluelabel:您要查找的关键字是“自动填充”。另见a.o.@Talib:它们都指的是完全相同的对象。它是Java,一种面向对象的语言,而不是PHP或其他语言。如果它对您不起作用,那么要么这些标题稍后会被覆盖,要么旧页面仍在浏览器缓存中,要么您已使用siml