jsf - 避免 JSF Web 应用程序上的后退按钮

标签 jsf browser back-button

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

我怎样才能实现这个目标?

最佳答案

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

您所需要做的就是指示浏览器不要缓存受限制的页面。您可以使用一个简单的 servlet 过滤器来完成此操作,该过滤器设置 appropriate response headers :

@WebFilter
public class NoCacheFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        if (!request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
            response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
            response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
            response.setDateHeader("Expires", 0); // Proxies.
        }

        chain.doFilter(req, res);
    }

    // ...
}

(请注意,此过滤器会跳过 JSF 资源请求, whose caching actually needs to be configured separately )

要让它在每个 JSF 请求上运行,请在过滤器类上设置以下注释,假设 <servlet-name> 的值FacesServlet的在您的网络应用程序的 web.xml 中是 facesServlet :

@WebFilter(servletNames={"facesServlet"})

或者,让它仅在特定的 URL 模式上运行,例如与受限页面匹配的 URL 模式,例如/app/* , /private/* , /secured/* ,或者这样,在过滤器类上设置以下注释:

@WebFilter("/app/*")

如果您已经有一个过滤器,您甚至可以在检查登录用户的过滤器中执行相同的工作。

如果您碰巧使用JSF实用程序库OmniFaces ,那么你也可以直接获取它的 CacheControlFilter 。这显然也考虑了 JSF 资源。

另请参阅:

关于jsf - 避免 JSF Web 应用程序上的后退按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31595296/

相关文章:

iphone - 如何复制后退按钮?

jsf - Primefaces 数据表行编辑器

java.lang.ClassCastException : org. primefaces.model.DefaultUploadedFile 无法转换为 java.io.File

javascript - 所有浏览器引擎都将 "\<"视为 "<"并将 "\>"视为 ">"吗?

javascript - 使用浏览器解释的替代脚本语言而不是 Javascript

Facebook 对话框和后退按钮

android - onKeyDown() 或 onBackPressed()

java - Primefaces动态树

jsf - 由 : javax. naming.NameNotFoundException 引起 - 名称 [类/对象] 未绑定(bind)在此上下文中

c# - 如何使用 C# 以编程方式将 html 字符串直接传递给 Web 浏览器?