结合mvc:interceptors& mvc:仅缓存静态资源的资源

时间:2012-06-26 12:26:58

标签: spring-mvc

我正在尝试将Spring MVC配置为具有以下方案:

  • 任何以“{context} / resources”开头的网址都应该是可缓存的
  • 任何其他网址都不应该是可缓存的(在我的情况下,“资源”所有内容都是动态网页)

使用mvc:resource:

,第一部分非常简单
<mvc:resources mapping="/resources/**" location="..." cache-period="3600"/>

第二部分,我有点失落。 默认情况下,似乎“动态资源”没有与缓存相关的信息(没有缓存控制头,没有编译指示等...)。有些浏览器可能会缓存内容(FF),有些可能不会(Chrome),这是不可或缺的。

有许多关于如何使用组合和WebContentInterceptor使一些页面可缓存的帖子:

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

然而在我的情况下,这是不可用的,因为我没有匹配的路径表达式(排除是众所周知的不可能)。

那么有什么方法可以表达这个: *做mvc:resources为资源做什么 *为所有其他页面做“某事”?

我能看到的唯一选择是编写一个自定义拦截器来检查某些东西是否是一种资源,但是如果不能全局定义缓存属性听起来有点奇怪。

由于

1 个答案:

答案 0 :(得分:1)

Spring MVC就像你想要的那样。 WebContentInterceptor 仅拦截缓存控制并将其添加到 text / html 资源的请求中。

对所有网址执行此操作的方法是将&lt; mvc:mapping&gt; 从配置中删除:

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

另外,因为&lt; mvc:interceptors&gt; &amp; &lt; mvc:resources&gt; 是独立的,这两个标签的任何特定顺序都不重要(与答案here中的建议不同)。