0

为了不缓存网页,在 java 控制器 servlet 中,我在一个方法中做了这样的事情:

public ModelAndView home(HttpServletRequest request, HttpServletResponse response) throws Exception {
    ModelAndView mav = new ModelAndView(ViewConstants.MV_MAIN_HOME);
    mav.addObject("testing", "Test this string");
    mav.addObject(request);
    response.setHeader("Cache-Control", "no-cache, no-store");
    response.setHeader("Pragma", "no-cache");
    response.setDateHeader("Expires", 0);
    return mav;
}

但这仅适用于特定的响应对象。我在 servlet 中有许多类似的方法。我也有很多 servlet。

如果我想在整个应用程序中禁用缓存,我应该怎么做?(我不想为每个响应对象添加上面的代码)。

4

1 回答 1

1

为什么不通过过滤器做到这一点?

过滤器是一个可以转换请求或响应的标头和内容(或两者)的对象。 

...

过滤器可以执行的主要任务如下:

...

  • 修改响应头和数据。您可以通过提供自定义版本的响应来做到这一点。

只需注册您的过滤器(实现过滤器接口的类)并在doFilter方法中修改您的响应。


编辑:例如

@WebFilter("/*")
public class NoCacheFilter implements javax.servlet.Filter {

    @Override
    public void init(final FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest)servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        response.setHeader("Cache-Control", "no-cache, no-store");
        response.setHeader("Pragma", "no-cache");
        response.setDateHeader("Expires", 0);

        filterChain.doFilter(request, response);
    }

    @Override
    public void destroy() {
    }
}

请注意,@WebFilter注释将需要 Servlet 3.0,否则您可以通过web.xml. “/*”的这个路径将适用于您的应用程序的任何路径,但可以缩小范围。

于 2014-05-29T21:56:13.887 回答