在Spring Boot中按内容类型缓存静态文件

问题描述 投票:0回答:1

我正在尝试在Spring Boot中为特定的静态文件类型设置缓存头。在目录src / main / resources / static中,有几个具有不同文件类型的子目录:

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

但是当我直接转到URL时,我得到404

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

没有任何配置,我会得到“无存储” Cache-Control标头。

spring spring-boot caching http-headers content-type
1个回答
0
投票

ResourceHandlerRegistry应该可以帮助您。您可以基于addResourceHandler documentation定义这种模式。然后,如此处建议的那样:https://stackoverflow.com/a/33216168/6908551,您可以扩展示例,并具有如下所示的内容:

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/static/font/{filename:\\w+\\.otf}").setCachePeriod(365 * 24 * 60 * 60); // convert days to seconds
    registry.addResourceHandler("/static/images/{filename:\\w+\\.png}").setCachePeriod(30 * 24 * 60 * 60); // convert days to seconds
    registry.addResourceHandler("/static/images/{filename:\\w+\\.jpg}").setCachePeriod(7 * 24 * 60 * 60); // convert days to seconds
}

或者,更好的选择是使用CacheControl对象,对于高于4.2的Spring,>。这样的事情应该起作用:

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/static/font/{filename:\\w+\\.otf}").setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS));
    registry.addResourceHandler("/static/images/{filename:\\w+\\.png}").setCacheControl(CacheControl.maxAge(30, TimeUnit.DAYS));
    registry.addResourceHandler("/static/images/{filename:\\w+\\.jpg}")setCacheControl(CacheControl.maxAge(7, TimeUnit.DAYS));
}

© www.soinside.com 2019 - 2024. All rights reserved.