Есть ли способ кэшировать файлы Spring <mvc: resources> в памяти?

1

Предположим, что я привязал все URL-адреса к сервлету диспетчера Spring и установил некоторые .css и .js каталоги с помощью <mvc:resources> в пространстве имен mvc Spring.

Можно ли кэшировать эти статические ресурсы Spring в памяти, чтобы избежать попадания диска по запросу пользователя?

(Обратите внимание, что я не спрашиваю о кешировании HTTP, как Not Modified response, а также не хочу, чтобы кеширование Tomcat статичных файлов или настройка другого веб-сервера перед веб-сервером Java, просто решение Spring)

  • 0
    Разве cache-period отвечает на ваш вопрос?
  • 0
    @ArtemBilan Как я знаю, это включает в себя дальнейший запрос клиента и HTTP-ответ (не измененный), но если новый клиент хочет загрузить файлы (посещает страницу), то происходит чтение с диска.
Теги:
spring
resources
caching
static-files

1 ответ

4
Лучший ответ

Ну, как вы говорите, что вы хотите 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>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню