Insight mvc:resources cache-period 解析

原创 2016年08月05日 15:32:53

疑问:springmvc 的配置项中<mvc:resources location="/static/" mapping="/static/**" cache-period="86400" />cache-period属性是怎样生效的?

...

Insight spring源码,按照以往的分析,mvc:xxx配置的解析由MvcNamespaceHandler完成。

/**
 * NamespaceHandler for Spring MVC configuration namespace.
 *
 */
public class MvcNamespaceHandler extends NamespaceHandlerSupport {

	public void init() {
		registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());
		registerBeanDefinitionParser("default-servlet-handler", new DefaultServletHandlerBeanDefinitionParser());
		registerBeanDefinitionParser("interceptors", new InterceptorsBeanDefinitionParser());
		registerBeanDefinitionParser("resources", new ResourcesBeanDefinitionParser());
		registerBeanDefinitionParser("view-controller", new ViewControllerBeanDefinitionParser());
	}

}
此时注册了mvc:resources 的解析器为ResourcesBeanDefinitionParser。

...

springmvc 对静态资源提供了特定的RequestHandler: ResourceHttpRequestHandler。解析的cache-period做为Handler的cacheSeconds的值。

private String registerResourceHandler(ParserContext parserContext, Element element, Object source) {
    // ...
    RootBeanDefinition resourceHandlerDef = new RootBeanDefinition(ResourceHttpRequestHandler.class);
    // cache-period parse
    String cacheSeconds = element.getAttribute("cache-period");
    if (StringUtils.hasText(cacheSeconds)) {
    	// see WebContentGenerator.setCacheSeconds(int seconds)
    	resourceHandlerDef.getPropertyValues().add("cacheSeconds", cacheSeconds);
    }
    // ...
    return beanName;
}
...

此时,cache-period解析完毕并且赋值给RequestHandler。那么RequestHandler的cacheSeconds作用是什么?

直接看实现,cacheSeconds体现在response 的header中,Tell browser直接用本地缓存吧。

public class ResourceHttpRequestHandler extends WebContentGenerator implements HttpRequestHandler, InitializingBean {

    /**
     * Processes a resource request.
     */
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) {
        // Checks for supported methods and a required session, and applies the number of cache seconds.
        checkAndPrepare(request, response, true);
        // check whether a matching resource exists
        Resource resource = getResource(request);
        // check the resource's media type
        MediaType mediaType = getMediaType(resource);
        // header phase
        setHeaders(response, resource, mediaType);
        // content phase
        writeContent(response, resource);
    }
    
    /**
     * Apply the given cache seconds and generate respective HTTP headers.
     * That is, allow caching for the given number of seconds in the
     * case of a positive value, prevent caching if given a 0 value, else
     * do nothing (i.e. leave caching to the client).
     */
    protected final void applyCacheSeconds(HttpServletResponse response, int seconds, boolean mustRevalidate) {
        if (seconds > 0) {
            // 我们的cacheSeconds是86400
            cacheForSeconds(response, seconds, mustRevalidate);
        }
        else if (seconds == 0) {
        	preventCaching(response);
        }
        // Leave caching to the client otherwise.
    }
    
    /**
     * Set HTTP headers to allow caching for the given number of seconds.
     * Tells the browser to revalidate the resource if mustRevalidate is True.
     */
    protected final void cacheForSeconds(HttpServletResponse response, int seconds, boolean mustRevalidate) {
        if (this.useCacheControlHeader) {
            // HTTP 1.1 header
            String headerValue = "max-age=" + seconds;
            if (mustRevalidate || this.alwaysMustRevalidate) {
            	headerValue += ", must-revalidate";
            }
            response.setHeader(HEADER_CACHE_CONTROL, headerValue);
        }
    }
	
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

Spring3 MVC详解一

DispatcherServlet 前置控制器   使用Spring MVC,配置DispatcherServlet是第一步。DispatcherServlet是一个Servlet,所以可以...
  • liumm0000
  • liumm0000
  • 2012年05月14日 17:34
  • 36345

SpringMVC对静态资源进行缓存

在dispatcher-servlet.xml中配置: Xml代码                 mvc:resources mapping="/res/**" loca...
  • qq_17257809
  • qq_17257809
  • 2016年06月08日 17:18
  • 2726

Spring参考手册 mvc:resources

This tag allows static resource requests following a particular URL pattern to be served by a Resour...
  • at1943
  • at1943
  • 2011年07月02日 15:25
  • 3636

SpringMVC对静态资源文件的访问(配置)

=================================================================== 加,否则servlet控件器会解析失败...
  • Sbangm
  • Sbangm
  • 2014年12月04日 13:05
  • 31698

Spring参考手册 mvc:resources 分类:

例如,通过/resources/**访问根目录下public-resources文件夹下的资源,标签可以像下边这么写: 设置一年的缓存时间以最大化的利用浏览器缓存和减少服务器压力: ...
  • lanchengxiaoxiao
  • lanchengxiaoxiao
  • 2012年04月07日 10:15
  • 4918

mvc:resources拦截资源显示问题

mvc:resources拦截资源显示问题         resource明确不要拦截的资源(静态资源)                               ...
  • y666666y
  • y666666y
  • 2017年04月17日 16:14
  • 3731

18、Spring MVC 之 HTTP caching support

一个好的HTTP缓存策略可以显著的提高一个web应用的性能以及客户体验。HTTP响应头'Cache-Control',条件头'Last-Modified'以及'ETag'通常负责这个....
  • u012410733
  • u012410733
  • 2016年11月07日 20:49
  • 1245

SpringBoot静态资源处理

8.8 Spring Boot静态资源处理 当使用Spring Boot来开发一个完整的系统时,我们往往需要用到前端页面,这就不可或缺地需要访问到静态资源,比如图片、css、js等文件。 Spring...
  • hanerer1314
  • hanerer1314
  • 2017年12月15日 21:50
  • 215

011 RESTful接口优化

011 RESTful接口优化视频分享到youtube上了。 https://youtu.be/2oNGCB_j6V0 优酷链接 原因:按照相关规定,限制传播以下RESTful API 设...
  • aslucky
  • aslucky
  • 2017年06月21日 20:27
  • 300

Spring Boot 实践折腾记(五):自定义配置,扩展Spring MVC配置并使用fastjson

专注和简单一直是我的秘诀之一。简单可能比复杂更难做到:你必须努力理清思路,从而使其变得简单。但最终这是值得的,因为一旦你做到了,便可以创造奇迹。——乔布斯...
  • mickjoust
  • mickjoust
  • 2016年06月16日 17:26
  • 22366
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Insight mvc:resources cache-period 解析
举报原因:
原因补充:

(最多只允许输入30个字)