代码之家  ›  专栏  ›  技术社区  ›  Piotr Müller

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

  •  2
  • Piotr Müller  · 技术社区  · 10 年前

    假设我已经将所有url绑定到Spring分派器servlet,并设置了一些 .css .js 目录 <mvc:resources> 在mvc Spring命名空间中。

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

    (请注意,我不是在询问HTTP缓存 Not Modified 响应,也不意味着Tomcat静态文件缓存或在Java Web服务器前面设置另一个Web服务器,只是Spring解决方案)

    1 回复  |  直到 10 年前
        1
  •  4
  •   Artem Bilan    10 年前

    嗯,正如你所说,你想 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>