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



假设我已经将所有网址绑定到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>

相关内容

  • 没有找到相关文章

最新更新