我有一些JavaScript捆绑文件,是相当大的,~ 1 MB。我尝试在yml文件中使用以下应用程序属性打开响应压缩:
server.compression.enabled: true
server.compression.mime-types: application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css
字符串
但这不管用。未发生压缩。
请求标头:
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
Accept: */*
Accept-Encoding: gzip, deflate, sdch, br
型
响应标头
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Connection:keep-alive
Content-Length:842821
Content-Type:application/javascript;charset=UTF-8
型
响应中没有内容编码标头。
我使用的是Sping Boot 版本1.3.5.RELEASE
我错过了什么?
编辑4 =我计划创建一个独立的应用程序,以进一步调查为什么内容压缩属性不起作用。但突然它开始工作,我没有改变任何东西的配置明智的,而不是POM文件的变化,而不是应用程序。所以我不知道是什么改变了我们的关系...
**=编辑3=**进一步遵循@chimmi的建议。我已经在建议的地方设置了断点。看起来对静态资源(js文件)的请求从未在这些断点处停止。只有其余的API请求可以。对于那些请求,由于某种原因,内容长度为零,这导致内容压缩被跳过。
x1c 0d1x的数据
**=编辑2=**我在o.s.b.a.w.ServerProperties的第180行放置了一个断点,感谢@chimmi的建议,它显示所有属性都已设置,但不知何故服务器不荣誉设置...:(
的
=编辑1=
我不确定这是否重要,但我在这里粘贴了我的应用程序主代码和配置代码:
网址:Application.java
@SpringBootApplication
public class TuangouApplication extends SpringBootServletInitializer {
public static void main(String[] args) throws Exception {
SpringApplication.run(TuangouApplication.class, args);
}
// this is for WAR file deployment
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(TuangouApplication.class);
}
@Bean
public javax.validation.Validator localValidatorFactoryBean() {
return new LocalValidatorFactoryBean();
}
}
型
配置:
@Configuration
public class TuangouConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http.antMatcher("/**").authorizeRequests().antMatchers("/", "/login**").permitAll()
.and().antMatcher("/**").authorizeRequests().antMatchers("/api/**").permitAll()
.and().exceptionHandling().authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/"))
.and().formLogin().loginPage("/login").failureUrl("/login?error").permitAll()
.and().logout().logoutSuccessUrl("/").permitAll()
.and().csrf().csrfTokenRepository(csrfTokenRepository())
.and().addFilterAfter(csrfHeaderFilter(), CsrfFilter.class)
.headers().defaultsDisabled().cacheControl();
// @formatter:on
}
@Order(Ordered.HIGHEST_PRECEDENCE)
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled=true)
protected static class AuthenticationSecurity extends GlobalAuthenticationConfigurerAdapter {
@Override
public void init(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService()).passwordEncoder(new BCryptPasswordEncoder());
}
@Bean
public UserDetailsService userDetailsService() {
return new DatabaseUserServiceDetails();
}
}
private Filter csrfHeaderFilter() {
return new OncePerRequestFilter() {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
CsrfToken csrf = (CsrfToken) request
.getAttribute(CsrfToken.class.getName());
if (csrf != null) {
Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN");
String token = csrf.getToken();
if (cookie == null
|| token != null && !token.equals(cookie.getValue())) {
cookie = new Cookie("XSRF-TOKEN", token);
cookie.setPath("/");
response.addCookie(cookie);
}
}
filterChain.doFilter(request, response);
}
};
}
private CsrfTokenRepository csrfTokenRepository() {
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
repository.setHeaderName("X-XSRF-TOKEN");
return repository;
}
}
型
资源服务器配置:
@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter{
@Autowired
private TokenStore tokenStore;
@Override
public void configure(ResourceServerSecurityConfigurer resources)
throws Exception {
resources.tokenStore(tokenStore);
}
@Override
public void configure(HttpSecurity http) throws Exception {
// @formatter:off
http.antMatcher("/**").authorizeRequests().antMatchers("/api/**").permitAll();
// @formatter:on
}
}
型
8条答案
按热度按时间yx2lnoni1#
问题可能出在YAML配置上。如果您使用'Starters',SnakeYAML将通过
spring-boot-starter
自动提供。如果不这样做,则必须在application.properties中使用属性约定。使用YAML而不是属性**EDIT:**在yml文件中尝试:
字符串
wfauudbj2#
从来没有太多的运气与Spring Boot 压缩。一个简单的解决方案可能是使用第三方库,如ziplet。
添加到pom.xml
字符串
添加到您的@Config类:
型
i7uaboj43#
如果你使用非嵌入式Tomcat,你应该把它添加到你的server.xml中:
字符串
更多tomcat8配置变量
j1dl9f464#
你试过不同的浏览器吗?这可能是因为防病毒软件正在解压缩文件,如SO post Spring boot http response compression doesn't work for some User-Agents中所述
vbkedwbf5#
您必须启用SSL,如http2模式,响应压缩(内容编码)可以工作,当配置SSL模式时。
的数据
响应压缩
application.yml
字符串
js81xvg66#
我在生产上遇到了同样的问题。我的配置文件如下:
字符串
由于我没有使用Embedded tomcat,我必须通过编辑
server.xml
文件的以下部分来启用Tomcat本身的压缩:型
请确保此部分包含
compression="on"
部分,并且问题应得到解决bakd9h0s7#
升级到Sping Boot 2.6时,我必须将以下内容添加到我的
application.yml
中,以允许压缩静态资源:字符串
server.compression
设置似乎不会影响这一点。n53p2ov08#
我也遇到了同样的问题,为此花了很多时间遍历Apache和Spring代码。我最终追踪到了
org.apache.coyote.CompressionConfig::useCompression()
,发现了一些令人惊讶的东西。如果你生成的ETag很强(也就是说,它们不是以W/开头),那么压缩将被禁用。我使用的是Spring的
ShallowEtagHeaderFilter
。默认情况下,生成强ETag。我的解决方法是通过setWriteWeakETag(true)
来改变它。