我正在尝试在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标头。
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));
}