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);
        }
    }
	
}


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tt50335971/article/details/52129213

SpringMVC对静态资源进行缓存

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

Spring3 MVC详解一

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

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

=================================================================== 加,否则servlet控件器会解析失败...
  • Sbangm
  • Sbangm
  • 2014-12-04 13:05:16
  • 32543

Spring参考手册 mvc:resources 分类:

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

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

专注和简单一直是我的秘诀之一。简单可能比复杂更难做到:你必须努力理清思路,从而使其变得简单。但最终这是值得的,因为一旦你做到了,便可以创造奇迹。——乔布斯...
  • mickjoust
  • mickjoust
  • 2016-06-16 17:26:00
  • 26954

深入 Spring 系列之静态资源处理

前一段时间,WebIDE 开源的过程中,无意间接触到 webjars,觉得比较有趣,于是研究并整理了一下。webjars 是将前端的库(比如 jQuery)打包成 Jar 文件,然后使用基于 JVM ...
  • chen517611641
  • chen517611641
  • 2016-10-12 10:27:30
  • 6501

SpringBoot常用配置

前言:springboot集成了主流的第三方框架,但是需要使用springboot那一套配置方式。但是我这里只列举了非常非常常用的,可以看已发的几篇博客,慢慢会补充。当然官方文档里也有相应的配置,可惜...
  • u012486840
  • u012486840
  • 2016-11-29 17:55:04
  • 6417

SpringBoot静态资源处理

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

Spring Boot 学习笔记(二)—— WEB相关配置

一、前言 上次我们快速搭建了一个Spring Boot项目,我们只需添加业务逻辑就能直接运行访问了,说明Spring Boot已经自动为我们做完了配置工作,这次我们就来看看具体是哪些工作,如果我们想...
  • swift0824
  • swift0824
  • 2018-01-23 13:22:02
  • 50
收藏助手
不良信息举报
您举报文章:Insight mvc:resources cache-period 解析
举报原因:
原因补充:

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