我已经为spring boot嵌入式服务器启用了gzip。我关心的是spring boot如何处理静态资源的gzip。由于这些没有改变,弹簧启动(或底层嵌入式服务器)是否运行gzip算法一次然后缓存结果?在每次静态资源请求上运行gzip算法似乎都浪费了处理能力。
答案 0 :(得分:0)
你必须使用Spring ResourceResolver
专门围绕缓存CachingResourceResolver
。您的配置应该是这样的:
@Configuration
@EnableWebMvc
@EnableCaching
public class MvcConfig extends WebMvcConfigurerAdapter {
@Autowired
private CacheManager cacheManager;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/resources/**")
.addResourceLocations("/resources/")
.setCachePeriod(3600) // Browser cache
.resourceChain(true)
.addResolver(new CachingResourceResolver(cacheManager, "resourceCache"))
.addResolver(new GzipResourceResolver())
.addResolver(new PathResourceResolver());
}
}
重要的是必须为应用程序配置CacheManager,因此请查看Spring Boot Caching docs以获取更多信息(可能最适合使用Caffeine的本地缓存)。
答案 1 :(得分:0)
GzipResourceResolver
在资源目录中查找*.gz
个文件,您必须在构建时准备这些文件。我认为它不会动态地抓取资源,这可以解决您的问题。
主要文档并未直接涵盖此内容:https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-spring-mvc-static-content
您可以通过
进行配置1)在构建时,创建所有静态文件的gzip副本,例如由:
gzip --keep --best -r src/main/resources/public
2)通过添加类如:
来配置spring@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/**")
.addResourceLocations("/public/")
.resourceChain(true) // cache resource lookups
.addResolver(new GzipResourceResolver())
.addResolver(new PathResourceResolver());
}
}