Spring MVC 缓存问题

首先说一下,静态资源的缓存没有问题,该问题是关于动态内容的缓存,需求是获取各国家列表,因为国家列表内容相对稳定些,所以想利用缓存节省不必要的开销。

 

代码如下:

  • 用于获取各国家列表的 Controller:
    @Controller
    @RequestMapping("/country")
    public class CountryController{
    
        @Autowired
        private 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 时,请求头信息和响应头信息如下:

 

Request
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Cookie:JSESSIONID=FE1D5C67B795BEBB40C2A72367170A52
Host:localhost:8080
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36

 

 

 

Response
Cache-Control:max-age=31536000
Content-Language:zh-CN
Content-Length:4033
Content-Type:text/html;charset=UTF-8
Date:Sun, 23 Mar 2014 11:25:19 GMT
Expires:Mon, 23 Mar 2015 11:25:19 GMT
Server:Apache-Coyote/1.1

 

响应头信息中的 Cache-Control 和 Expires 都正确,多次刷新页面,通过浏览器调试工具查看,并没有从缓存中获取内容,希望懂的朋友帮忙找找原因。

 

 

 

 

 

 

1个回答

你对Cache-control理解的可能还不是很透彻,按照你描述的配置和测试结果来看,浏览器已经实现了缓存。
但是你测试的方式为[color=red]“多次刷新页面”[/color],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,则每次都重复访问

按刷新按扭
无论为何值,都会重复访问。

iteye_3366
iteye_3366 非常感谢,在你的指点下。。问题解决了
接近 6 年之前 回复
iteye_3366
iteye_3366 非常感谢,我对HTTP 缓存的理解仅限于读了几篇文章,看来是我测试方法有问题。 我应该是把 lastModified 和 cache-control 的效果混淆了。分给你了,我想再问两个问题,如果有时间的话您帮忙解答一下。 1.jQuery ajax 第一次请求是不是没办法携带 If-Modified-Since 请求头信息 2.Spring MVC 中 WebContentInterceptor 和 ContentNegotiatingViewResolver 共同使用时响应头信息中会出现两个 Cache-Control,如下: Cache-Control:max-age=31536000 Cache-Control:no-cache, no-store, max-age=0 一个是拦截器加的,另一个应该是视图解析器加的,两个 Cache-Control 这种情况,经测试 max-age 没起作用,这个问题有办法解决
接近 6 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问