0
/**
 * 
 */


public class NoCacheFilter implements Filter {

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

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

        chain.doFilter(request, response);
    }

    // ...

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void destroy() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

但它不起作用,我仍然可以在按下前进和后退按钮时获取页面。请帮忙。我已经清除了所有现有的缓存。

4

1 回答 1

1

您不应该在过滤器init()destroy(). 如果init()抛出异常,则过滤器不会投入使用,某些服务器甚至会完全中止 webapp 的部署。

如果您在那里没有什么可实施的,他们应该什么都不做。

@Override
public void init(FilterConfig filterConfig) throws ServletException {
    // NOOP.
}

@Override
public void destroy() {
    // NOOP.
}

您还需要确保过滤器映射到正确的 URL 模式或 servlet 名称。最简单的方法是@WebFilter("Faces Servlet")在类上放一个,其中Faces ServletFacesServlet条目的确切 servlet 名称,就像您在web.xml.

于 2012-04-10T14:02:16.450 回答