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