假设我已将所有URL绑定到Spring调度程序servlet,并在mvc Spring命名空间中使用.css
设置了一些.js
和<mvc:resources>
目录。
我可以在内存中缓存这些静态Spring资源,以避免在用户请求时遇到磁盘吗?
(请注意,我不是要问像Not Modified
响应这样的HTTP缓存,也不是指在Java webserwer之前缓存或设置另一个Web服务器的Tomcat静态文件,只是Spring解决方案)
答案 0 :(得分:4)
好吧,正如您所说,您希望cache
基础目标资源的整个内容,您必须从byte[]
缓存其inputStream
。
由于<mvc:resources>
由ResourceHttpRequestHandler
支持,因此无法停止编写自己的子类并直接使用它而不是自定义标记。
在覆盖的writeContent
方法中实现您的缓存逻辑:
public class CacheableResourceHttpRequestHandler extends ResourceHttpRequestHandler {
private Map<URL, byte[]> cache = new HashMap<URL, byte[]>();
@Override
protected void writeContent(HttpServletResponse response, Resource resource) throws IOException {
byte[] content = this.cache.get(resource.getURL());
if (content == null) {
content = StreamUtils.copyToByteArray(resource.getInputStream());
this.cache.put(resource.getURL(), content);
}
StreamUtils.copy(content, response.getOutputStream());
}
}
并将它从spring config用作通用bean:
<bean id="staticResources" class="com.my.proj.web.CacheableResourceHttpRequestHandler">
<property name="locations" value="/public-resources/"/>
</bean>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>/resources/**=staticResources</value>
</property>
</bean>