假设我已经将所有网址绑定到Spring dispatcher servlet,并在mvc Spring命名空间中设置了一些.css
和.js
<mvc:resources>
目录。
我可以将这些静态 Spring 资源缓存在内存中以避免在用户请求时命中磁盘吗?
(请注意,我不是在问像Not Modified
响应那样的HTTP缓存,也不是指Tomcat静态文件缓存或在Java webserwer前面设置另一个Web服务器,只是Spring解决方案)
好吧,正如您所说,您要cache
基础目标资源的全部内容,您必须从inputStream
缓存其byte[]
。
由于<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 配置中使用它作为通用 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>