如何使用 Tomcat 启用静态内容(图像、css、js)的浏览器缓存?

Posted

技术标签:

【中文标题】如何使用 Tomcat 启用静态内容(图像、css、js)的浏览器缓存?【英文标题】:How to enable browser caching of static content(images, css, js) with Tomcat? 【发布时间】:2011-05-06 14:49:20 【问题描述】:

首选的解决方案是编辑spring MVC 配置文件或 web.xml

【问题讨论】:

【参考方案1】:

尝试(改变值)

<mvc:resources mapping="/static/**" location="/public-resources/" 
       cache-period="31556926"/>
<mvc:annotation-driven/>

你也可以使用拦截器:

<mvc:interceptors>
   <mvc:interceptor>
    <mvc:mapping path="/static/*"/>
    <bean id="webContentInterceptor" 
         class="org.springframework.web.servlet.mvc.WebContentInterceptor">
        <property name="cacheSeconds" value="31556926"/>
        <property name="useExpiresHeader" value="true"/>
        <property name="useCacheControlHeader" value="true"/>
        <property name="useCacheControlNoStore" value="true"/>
    </bean>
   </mvc:interceptor>
</mvc:interceptors>

见MVC docs

【讨论】:

一点修正,正确的标签是“mvc:mapping”而不是“mapping”,即正确的完整标签是: 我应该使用哪个?我目前处于两种都有的情况,想知道是否需要两者。看来我应该选择其中之一。使用 mvc:resources 元素有什么好处吗? 304的情况下,客户端也会向服务器发送一个HTTP请求,那么它是如何受益的 @Manish 客户端仍然会向服务器发送 HTTP 请求,但服务器会回复一个微小的 304 响应,而不是传输您可能很大的文件(例如图像、css、js...)返回 200 响应。换句话说,请求/响应的数量是相同的,但响应的大小可能要小得多。【参考方案2】:

如果使用的是 Spring 3.0,&lt;mvc:resources&gt; 是实现静态资源缓存的一种方式。 This link 有一些文档。

【讨论】:

【参考方案3】:

对于那些使用Java配置的人,您可以使用ResourceHandlerRegistry管理缓存参数,有一个示例如何为不同的内容类型设置不同的缓存首选项:

@Configuration
@EnableWebMvc
// ...
public class WebConfiguration extends WebMvcConfigurerAdapter 

    // ...

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) 

        registry.addResourceHandler("/ui/css/**")
                .addResourceLocations("classpath:/WEB-INF/css/")
                .setCacheControl(CacheControl.maxAge(1, TimeUnit.DAYS));

        registry.addResourceHandler("/ui/js/**")
                .addResourceLocations("classpath:/WEB-INF/js/")
                .setCacheControl(CacheControl.maxAge(1, TimeUnit.DAYS));

        registry.addResourceHandler("/ui/**")
                .addResourceLocations("classpath:/WEB-INF/")
                .setCacheControl(CacheControl.noCache());
    

    // ...

【讨论】:

以上是关于如何使用 Tomcat 启用静态内容(图像、css、js)的浏览器缓存?的主要内容,如果未能解决你的问题,请参考以下文章

如何启用 CORS tomcat 8.5 过滤器来访问静态文件?

css [CSS静态布局]默认情况下使您的布局快速和静态。在每个元素的基础上启用基于内容的大小调整。 #CSS #tips

如何在 Amazon Beanstalk 和 Tomcat 上启用 HTML/JavaScript/CSS 的 gzip

如何在 Jetty 中启用 gzip 压缩?

如何使静态网站的内容可共享

用静态内容替换图像 wildfly 10