退出后避免后台页面呈现

时间:2012-05-18 18:24:39

标签: java html jsf browser-cache

我见过:

How to control web page caching, across all browsers? enter link description here

我在JSF 1.2页面中使用过:

<meta http-equiv="Cache-control" content="no-store, no-cache, must-revalidate"/>
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="-1"/>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8"/>

它在IE8 e Chrome中无效!当我使用后退按钮时,它再次显示页面! 怎么了? 问候。

1 个答案:

答案 0 :(得分:3)

以下是How to control web page caching, across all browsers?引用的一个引用,您在问题中将其链接但显然被忽略了:

  

请注意,当页面通过HTTP提供并且标头出现在两者 HTTP响应标头和HTML元标记中时,响应标头中指定的标头将优先于HTML元标记。只有在从本地磁盘文件系统查看页面时才会使用HTML元标记。另见W3 HTML spec chapter 5.2.2。如果不以编程方式指定它们,请注意这一点,因为Web服务器可以包含一些默认值。要验证一个和另一个,您可以使用Firebug Net面板查看/调试它们。

显然就是这种情况。您需要在真实的HTTP响应上设置这些标头,而不是在HTML输出中。对于JSF 1.x Web应用程序,最好的方法是创建servlet filter来执行任务。这是一个启动示例:

public class NoCacheFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        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);
    }

    // ...
}

web.xml上将其映射到感兴趣的网址格式,例如: *.jsfFacesServlet的servlet名称。