让以下内容:
<mvc:resources mapping="/resources/**" location="/resources/" />
并说2000个请求来
/resources/script/app/myhax.js
如果我没有配置任何内容,myhax.js
以某种方式缓存到RAM中,其余的请求是从那里提供的,还是从文件的真实路径(通常是HDD)提供的所有2000个请求?可以将Spring配置为在将该文件直接从内存请求以供将来服务后将其保留在RAM中吗?
答案 0 :(得分:2)
Spring没有资源。但是有可能为了允许缓存资源。
您可以指定cache-period(以发送具有给定最大年龄值的缓存标头)例如
<resources mapping="/resources/**" location="/resources/" cache-period="3600"/>
OR
mvc:resources
由ResourceHttpRequestHandler支持,因此您可以创建自己的扩展ResourceHttpRequestHandler
的子类,并通过覆盖适当的方法来实现缓存逻辑,例如writeContent
(注意,您可以参考到文档或源代码以找出可用方法的列表)并在spring config中使用这个新的子类。
E.g。
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
public class CacheResourceHandler extends ResourceHttpRequestHandler {
private Map<URL, byte[]> cache = new HashMap<>();
@Override
protected void writeContent(HttpServletResponse resp, Resource rsc) throws IOException {
byte[] buff = cache.get(rsc.getURL());
//if not in cache
if (buff == null) {
//add to cache
buff = StreamUtils.copyToByteArray(rsc.getInputStream());
cache.put(rsc.getURL(), buff);
}
//return cache version
StreamUtils.copy(buff, resp.getOutputStream());
}
}
Xml配置
我们需要注释掉或删除以前的资源映射
<!--<resources mapping="/resources/**" location="/resources/" />-->
接下来我们需要声明我们的缓存处理程序bean
<bean id="staticResources" class="CacheResourceHandler">
<property name="locations" value="/resources/"/>
</bean>
最后,我们将使用上面声明的SimpleUrlHandlerMapping来实现HandlerMapping
接口,以便从URLS映射到请求处理程序bean。我们所需要的只是传递我们的bean进行映射
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>/resources/**=staticResources</value>
</property>
</bean>