我想知道Spring或Spring Boot是否支持提供预压缩资源。
例如,nginx支持gzip_static on
标志。
当客户端发送Accept-Encoding: gzip
请求标头时,nginx会检查是否存在具有所请求名称和结尾“.gz”的文件。如果存在这样的文件,nginx会将其提供给客户端并节省一些CPU周期,因为它不必动态压缩它。
我可以使用Spring执行相同操作并将所有文件压缩到静态文件夹中,嵌入式Web服务器是否像nginx一样提供服务?
答案 0 :(得分:0)
是的,您可以为特定资源及其mime类型配置gzip
压缩。
如果您使用 application.yml 文件,它就是这样的:
server:
compression:
enabled: true
mime-types: text/html,text/xml,text/plain,text/css,text/javascript,application/javascript
min-response-size: 2048
以下是 application.properties 文件的类似配置:
server.compression.enabled=true # If response compression is enabled.
server.compression.mime-types=text/html,text/xml,text/plain,text/css,text/javascript,application/javascript # Comma-separated list of MIME types that should be compressed.
server.compression.min-response-size=2048 # Minimum response size that is required for compression to be performed.
您可以使用server.compression.mime-types
属性定义哪些资产必须压缩,在此示例中,我使用了Appendix A. Common application properties
中的一些默认值。
在这里,你可以看到一些没有压缩的演示Spring Boot应用程序的style.css
(439 KB)文件:
这里是相同的文件,但启用了压缩(65.8 KB):
答案 1 :(得分:0)
Spring支持这个用例 org.springframework.web.servlet.resource.GzipResourceResolver
当客户端发送.gz
标头时,此解析程序会搜索以Accept-Encoding: gzip
结尾的文件。
这是在Spring 4.1中引入的。
您可以使用资源配置启用此解析程序:
@Configuration
class ResourceConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/static/")
.resourceChain(false).addResolver(new GzipResourceResolver());
}
}
Spring Boot 1.4为gzip解析器添加了自动配置支持。将其添加到application.properties文件中,Spring Boot自动注册GzipResourceResolver
spring.resources.chain.gzipped=true
答案 2 :(得分:0)
据我所知,您没有这种可能性,但是您可以自己轻松地进行此操作。我认为这实际上应该在Tomcat或Jetty级别上实现。如果您实施了过滤器,请贡献力量,因为我也在寻找
答案 3 :(得分:0)
是的,可以。
此解决方案类似于JGrassini,但使用EncodedResourceResolver,您的应用程序将能够提供已压缩的.gz和.br文件:
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.setOrder(-1)
.addResourceHandler("/**")
.addResourceLocations("classpath:/where are your already compressed file to serve/")
.resourceChain(true)
.addResolver(new EncodedResourceResolver());
}
}
您可以阅读以下内容:docs.spring.io