【问题标题】:Unable to set cache control header for any static resources (Spring)无法为任何静态资源设置缓存控制标头(Spring)
【发布时间】:2017-06-15 08:24:28
【问题描述】:

我正在尝试为我网站中的任何静态资源(图像、js、css)设置缓存控制。我正在使用 Spring 4(带有 Spring Security)和 Tomcat 8 服务器。

我已经尝试在我的 web.xml 中设置 ExpiryFilter

<filter>
    <filter-name>ExpiresFilter</filter-name>
    <filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
    <init-param>
       <param-name>ExpiresByType image</param-name>
       <param-value>access plus 2 weeks</param-value>
    </init-param>
    <init-param>
       <param-name>ExpiresByType text/css</param-name>
       <param-value>access plus 2 weeks</param-value>
    </init-param>
    <init-param>
       <param-name>ExpiresByType text/javascript</param-name>
       <param-value>access plus 2 weeks</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>ExpiresFilter</filter-name>
    <url-pattern>/resources/*</url-pattern>
</filter-mapping>

但由于 ExpiresFilter 不起作用,我尝试使用缓存周期设置 MVC 资源:

<mvc:resources mapping="/resources/**" location="/resources/,classpath:/resources/" cache-period="2592000" />
<mvc:annotation-driven />

但它也不起作用。

我还尝试检查我的 web.xml 中的过滤器映射是否正常工作,但事实证明它没有过滤任何图像/js/css 类型,而是过滤了我的 html 文件。我的静态文件保存在 webapp/resources 文件夹中,无论我的 html 文件是否在 webapp/WEB-INF/jsp 文件中。

我还在我的 spring 安全配置中添加了这个:

<http pattern="/resources/**" security="none"></http>

有什么我想念的吗?

谢谢。

【问题讨论】:

  • 这是如何解决的。我也有同样的问题

标签: java spring tomcat caching


【解决方案1】:

我通过 org.apache.catalina.filters.ExpiresFilter.level = FINE 在 tomcat 的 logging.properties 中启用了 tomcat 过滤器的日志记录。

当过滤器初始化时,catalina 日志中打印了以下日志:

使用配置 ExpiresFilter[excludedResponseStatusCode=[304], default=null, byType={text/css=ExpiresConfiguration 初始化过滤器 [startingPoint=ACCESS_TIME, duration=[10 MINUTE]], application/javascript=ExpiresConfiguration[startingPoint=ACCESS_TIME, duration=[10 MINUTE]] , image=ExpiresConfiguration[startingPoint=ACCESS_TIME, duration=[10 MINUTE]]}]

您可以看到所有状态为 304 的 http 响应都将被排除在设置缓存控制参数时。

我配置了 tomcat 过滤器,我的资源被缓存了。我可以通过过滤器日志确认这一点:

org.apache.catalina.filters.ExpiresFilter onBeforeWriteResponseBody FINE:请求“/static/img/home/phone_icon2.png”,响应状态为“200”,内容类型为“image/png”,设置到期日期为 2017 年 1 月 31 日上午 11:59 2017 年 1 月 31 日上午 11:49:30 org.apache.catalina.filters.ExpiresFilter getExpirationDate FINE:使用 ExpiresConfiguration[startingPoint=ACCESS_TIME, duration=[10 MINUTE]] 匹配内容类型“image/png”的“image”返回 1/31/17 11:59 AM 2017 年 1 月 31 日上午 11:49:30 org.apache.catalina.filters.ExpiresFilter onBeforeWriteResponseBody FINE:请求“/static/img/home/bgimage.png”,响应状态为“200”,内容类型为“image/png”,设置到期日期为 2017 年 1 月 31 日上午 11:59 2017 年 1 月 31 日上午 11:49:30 org.apache.catalina.filters.ExpiresFilter getExpirationDate FINE:使用 ExpiresConfiguration[startingPoint=ACCESS_TIME, duration=[10 MINUTE]] 匹配内容类型“image/png”的“image”返回 1/31/17 11:59 AM

我建议您先启用日志记录Reference

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 2019-01-14
    • 2020-09-16
    • 2018-05-05
    • 2011-05-21
    • 2013-11-26
    • 2016-06-27
    相关资源
    最近更新 更多