Spring Boot GZIP只有一次静态资源吗?

时间:2016-09-20 05:03:07

标签: optimization spring-boot gzip

我已经为spring boot嵌入式服务器启用了gzip。我关心的是spring boot如何处理静态资源的gzip。由于这些没有改变,弹簧启动(或底层嵌入式服务器)是否运行gzip算法一次然后缓存结果?在每次静态资源请求上运行gzip算法似乎都浪费了处理能力。

2 个答案:

答案 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());
    }
}