我正在为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 ....
如何指定“映射”属性,以便“公共”部分之后的任何代码都得到妥善管理?
答案 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>