Cache stati c файлов по типу контента в Spring Boot - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь настроить заголовки кэширования для указанного c stati c типа файла в Spring Boot. В каталоге src / main / resources / stati c есть несколько подкаталогов с разными типами файлов:

src/main/resources/static/font   --> *.otf
src/main/resources/static/lib    --> *.js
src/main/resources/static/images --> *.png, *.jpg

Есть ли способ поместить заголовки кэша по типу файла в конфигурацию Spring?

*.otf 365 days
*.png 30 days
*.jpg 7 days

Версия Spring - 5.2.3 и Spring Boot 2.2.4 - есть ли вероятность, что Spring Boot с ней справится и не даст работать?

Пробовал с

@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
    final CacheControl oneYearPublic = CacheControl.maxAge(365, TimeUnit.DAYS).cachePublic();
    // it does not "work" with "/static/fonts/"
    registry.addResourceHandler("/fonts/{filename:\\w+\\.otf}").setCacheControl(oneYearPublic);
}

но я получаю странные результаты. При проверке с помощью вкладки Сеть DevTools я получаю следующие заголовки:

    Cache-Control: no-cache, no-store, max-age=0, must-revalidate
    Pragma: no-cache
    Expires: 0

Но когда я go обращаюсь к URL-адресу напрямую, я получаю 404

http://localhost/fonts/1952RHEINMETALL.otf

Без какой-либо конфигурации я получаю " Заголовок Cache-Control "no-store".

1 Ответ

1 голос
/ 14 февраля 2020

Мне удалось найти рабочее решение этой проблемы. Проверьте репозиторий GitHub https://github.com/alexsomai/cache-static-assets.

Это пример конфигурации, которая должна работать:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        Objects.requireNonNull(registry);

        // could use either '/**/images/{filename:\w+\.png}' or '/**/images/*.png'
        registry.addResourceHandler("/**/images/{filename:\\w+\\.png}")
                .addResourceLocations("classpath:/static/")
                .setCacheControl(CacheControl.maxAge(1, TimeUnit.DAYS));

        registry.addResourceHandler("/**/images/*.jpg")
                .addResourceLocations("classpath:/static/")
                .setCacheControl(CacheControl.maxAge(2, TimeUnit.DAYS));

        registry.addResourceHandler("/**/lib/*.js")
                .addResourceLocations("classpath:/static/")
                .setCacheControl(CacheControl.maxAge(3, TimeUnit.DAYS));
    }
}

Вы можете легко настроить ее для своих нужд, основываясь на тип файла и длительность кеша.

В качестве ключевых выводов обязательно добавьте функцию addResourceLocations (без этого вы получите 404). Кроме того, если вы используете Spring Boot, вам не нужно @EnableWebMvc, как это было первоначально размещено в этом примере { ссылка }.

...