In some web-app can be useful avoid browser caching of pages. This implies that a new request is needed every time a page is loaded.
Basically there are three ways to do this:
Basically there are three ways to do this:
- using HTML code
- defining a Java Filter on wanted URL
- if you are using SPring Framework, defining an Interceptor
HTML
The effect can be achieved by using meta tags in the HTML header:
<meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="no-cache"> <meta http-equiv="Expires" content="Sat, 01 Dec 2001 00:00:00 GMT">
The Cache-Control header was added in HTTP 1.1, while the other two were also present in HTTP 1.0.
Java Filter
HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1 httpResponse.setHeader("Pragma", "no-cache"); // HTTP 1.0 httpResponse.setDateHeader("Expires", 0); // Proxies. chain.doFilter(request, response);
The configuration of web.xml should looks like this:
<!-- MyServler --> <servlet> <servlet-name>myServlet</servlet-name> <servlet-class>mypackage.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>myServlet</servlet-name> <url-pattern>/path</url-pattern> </servlet-mapping> <!-- MyFilter --> <filter> <filter-name>myFilter</filter-name> <filter-class>mypackage.MyFilter</filter-class> <init-param> <param-name>pattern</param-name> <param-value>{{PATTERN HERE}}</param-value> </init-param> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/path</url-pattern> </filter-mapping>
Spring MVC
In Spring MVC, you can create an interceptor like so:
public class DisableBrowserCachingInterceptor extends HandlerInterceptorAdapter { public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { 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 } }
A handler interceptor is registered to the DefaultAnnotationHandlerMapping bean, which is charged with applying interceptors to any class marked with a @Controller annotation.
You can specify multiple interceptors in the interceptors property, whose type is an array.
<beans ...> ... <bean id="measurementInterceptor" class="com.apress.springrecipes.court.web.MeasurementInterceptor" /> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="interceptors"> <list> <ref bean="measurementInterceptor" /> </list> </property> ... </bean> </beans>