iteye_3366
2014-03-23 19:31 阅读 815
已采纳

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条回答 默认 最新

  • 已采纳
    piaobo2161978 hoocen 2014-03-23 21:45

    你对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,则每次都重复访问

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

    点赞 评论 复制链接分享

相关推荐