Предположим, что я привязал все URL-адреса к сервлету диспетчера Spring и установил некоторые .css
и .js
каталоги с помощью <mvc:resources>
в пространстве имен mvc Spring.
Можно ли кэшировать эти статические ресурсы Spring в памяти, чтобы избежать попадания диска по запросу пользователя?
(Обратите внимание, что я не спрашиваю о кешировании HTTP, как Not Modified
response, а также не хочу, чтобы кеширование Tomcat статичных файлов или настройка другого веб-сервера перед веб-сервером Java, просто решение Spring)
Ну, как вы говорите, что вы хотите cache
весь контент вашего основного целевого ресурса, вам нужно кэшировать его byte[]
из inputStream
.
Поскольку <mvc:resources>
поддерживается ResourceHttpRequestHandler
нет никаких остановок для написания собственного подкласса и использовать его непосредственно вместо этого настраиваемого тега.
И реализуйте свою логику кэширования только в writeContent
метода 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 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>
cache-period
отвечает на ваш вопрос?