Spring MVC:在<mvc:resources> </mvc:resources>中使用通配符

时间:2012-02-08 23:02:43

标签: spring-mvc

我正在为Spring MVC应用程序实现缓存清除系统。

要使此系统正常工作,我必须从给定的URL中删除“缓存清除代码”。假设我生成的缓存清除代码为“123”,并且我有一个.css网址: /public-123/css/style.css 。在此示例中,我希望成功调用 /public/css/style.css -123 必须被剥离)。

这适用于我的“mvc-config.xml”上下文文件:

<mvc:resources mapping="/public-123/**" location="/public/" />

但我还希望任何缓存破坏代码都能正常工作,即使它不是当前代码。例如,我还希望 /public-456/css/style.css 来访问style.css文件。

如果我尝试在映射中添加另一个通配符:

<mvc:resources mapping="/public-*/**" location="/public/" />

它不起作用!我收到了404 ....

如何指定“映射”属性,以便“公共”部分之后的任何代码都得到妥善管理?

3 个答案:

答案 0 :(得分:0)

处理此问题的一种方法是使用Spring EL,如Spring docs

所示
<mvc:resources mapping="/resources-#{applicationProps['application.version']}/**" location="/public-resources/"/>

您可以将“123”部分存储在属性文件中,这样它只会被设置一次。例如。通过property-placeholder

<context:property-placeholder location="classpath:myApp.properties"/>
<mvc:resources mapping="/resources-${cache.code}/**" location="/public-resources/"/>

这样做的好处是能够通过相同的属性值在JSP页面中读取此代码(以生成链接)。

答案 1 :(得分:0)

我设法通过手动定义ResourceHttpRequestHandler来处理位于<mvc:resources />标记旁边的文件系统上的资产,从而实现了这一目标:

<bean id="assetsResourceHandler" class="org.springframework.web.servlet.resource.ResourceHttpRequestHandler">
  <property name="locations">
    <list>
      <bean class="org.springframework.core.io.UrlResource">
        <constructor-arg value="file:#{applicationProps['assets.basedir']}"></constructor-arg>
      </bean>
    </list>
  </property>
</bean>

答案 2 :(得分:0)

我猜你这样做是为了实现静态资源的缓存清除。

与此同时,Spring 4.1 has dedicated features for this,您可以删除大量自定义配置。

这样的事情:

<mvc:resources mapping="/public/**" location="/public/"/>
  <mvc:resource-chain resource-cache="true">
    <mvc:resolvers>
      <mvc:version-resolver>
        <mvc:content-version-strategy patterns="/**"/>
      </mvc:version-resolver>
    </mvc:resolvers>
  </mvc:resource-chain>
</mvc:resources>