问题描述
首先说一下,静态资源的缓存没有问题,该问题是关于动态内容的缓存,需求是获取各国家列表,因为国家列表内容相对稳定些,所以想利用缓存节省不必要的开销。 代码如下:用于获取各国家列表的 Controller:@Controller@RequestMapping("/country")public class CountryController{@Autowiredprivate CountryService countryService;@RequestMapping(method=RequestMethod.GET)public ModelAndView show(){ModelAndView mav = new ModelAndView();mav.addObject("countryMap", countryService.getCountries());mav.setViewName("test");return mav;}}缓存拦截器配置<mvc:interceptor> <mvc:mapping path="/country*" /> <bean class="org.springframework.web.servlet.mvc.WebContentInterceptor" > <property name="cacheMappings"> <map> <entry key="/country.json" value="31536000"></entry> <entry key="/country" value="31536000"></entry> </map> </property> </bean></mvc:interceptor>当请求 http://host:port/app/country 时,请求头信息和响应头信息如下: RequestAccept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Encoding:gzip,deflate,sdchAccept-Language:zh-CN,zh;q=0.8Cache-Control:max-age=0Connection:keep-aliveCookie:JSESSIONID=FE1D5C67B795BEBB40C2A72367170A52Host:localhost:8080User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36 ResponseCache-Control:max-age=31536000Content-Language:zh-CNContent-Length:4033Content-Type:text/html;charset=UTF-8Date:Sun, 23 Mar 2014 11:25:19 GMTExpires:Mon, 23 Mar 2015 11:25:19 GMTServer:Apache-Coyote/1.1 响应头信息中的 Cache-Control 和 Expires 都正确,多次刷新页面,通过浏览器调试工具查看,并没有从缓存中获取内容,希望懂的朋友帮忙找找原因。
解决方案
你对Cache-control理解的可能还不是很透彻,按照你描述的配置和测试结果来看,浏览器已经实现了缓存。但是你测试的方式为“多次刷新页面”,Cache-control的值不管是什么内容,只要刷新页面,页面都会重新访问服务器。因此问题不在于工程配置问题或springmvc没有生效,而是你测试方式有问题,测试时应该在地址栏再次“回车”而不是“刷新”。cache-control配置对应浏览器访问的服务器的规则:打开新窗口如果指定cache-control的值为private、no-cache、must-revalidate,那么打开新窗口访问时都会重新访问服务器。而如果指定了max-age值,那么在此值内的时间里就不会重新访问服务器,例如:Cache-control: max-age=5表示当访问此网页后的5秒内不会再次访问服务器在地址栏回车如果值为private或must-revalidate(和网上说的不一样),则只有第一次访问时会访问服务器,以后就不再访问。如果值为no-cache,那么每次都会访问。如果值为max-age,则在过期之前不会重复访问。按后退按扭如果值为private、must-revalidate、max-age,则不会重访问,而如果为no-cache,则每次都重复访问按刷新按扭无论为何值,都会重复访问。