Как отключить кеш веб-страниц во всех сервлетах

Для веб-страницы без кэширования в сервлете контроллера Java я сделал что-то подобное в методе:

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;
}

Но это работает только для конкретного объекта ответа. У меня много подобных методов в сервлете. И у меня тоже много сервлетов.

Что мне делать, если я хочу отключить кеш во всем приложении? (Я не хочу добавлять код выше для каждого объекта ответа).

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, Этот путь "/*" будет применяться к любому пути вашего приложения, но может быть сужен по объему.

Другие вопросы по тегам