有没有办法在内存中缓存Spring <mvc:resources>文件?</mvc:resources>

时间:2014-04-01 08:12:03

标签: java spring caching resources static-files

假设我已将所有URL绑定到Spring调度程序servlet,并在mvc Sp​​ring命名空间中使用.css设置了一些.js<mvc:resources>目录。

我可以在内存中缓存这些静态Spring资源,以避免在用户请求时遇到磁盘吗?

(请注意,我不是要问像Not Modified响应这样的HTTP缓存,也不是指在Java webserwer之前缓存或设置另一个Web服务器的Tomcat静态文件,只是Spring解决方案)

1 个答案:

答案 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>