Ich habe eine JavaScript-gebündelte Datei, die ziemlich groß ist, ~ 1MB . Ich versuche, die Antwortkomprimierung mit den folgenden Anwendungseigenschaften in meiner Yml-Datei zu aktivieren:
server.compression.enabled: true
server.compression.mime-types: application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css
Aber es geht nicht. Es findet keine Komprimierung statt.
Anforderungsheader:
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
Antwortheader
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Connection:keep-alive
Content-Length:842821
Content-Type:application/javascript;charset=UTF-8
Die Antwort enthält keinen Header für die Inhaltskodierung.
Ich benutze Spring Boot Version 1.3.5.RELEASE
Was vermisse ich?
=== EDIT 4 === Ich hatte vor, eine eigenständige App zu erstellen, um weiter zu untersuchen, warum die Eigenschaften der Inhaltskomprimierung nicht funktionieren. Aber plötzlich fing es an zu arbeiten und ich habe nichts geändert in Bezug auf die Konfiguration, keine Änderung der POM-Datei, keine Änderung der Anwendungs.yml-Datei. Also weiß ich nicht, was sich geändert hat, dass es funktioniert hat ...
=== EDIT 3 === Folgen Sie den Vorschlägen von @ chimmi. Ich habe an den vorgeschlagenen Stellen Haltepunkte gesetzt. Es sieht so aus, als würden Anforderungen an statische Ressourcen (js-Dateien) an diesen Haltepunkten nie angehalten. Nur Rest-API-Anforderungen tun dies. Und für diese Anforderung war die Inhaltslänge aus irgendeinem Grund Null, wodurch die Inhaltskomprimierung übersprungen wird.
=== EDIT 2 === Ich habe dank @ chimmis Vorschlag einen Haltepunkt in Zeile 180 von osbawServerProperties gesetzt und zeigt an, dass alle Eigenschaften festgelegt sind, aber der Server erkennt dies irgendwie nicht die Einstellung... :(
=== BEARBEITEN 1 ===
ich weiß nicht, ob es wichtig ist, aber ich füge meinen Haupt- und Konfigurationscode der Anwendung hier ein:
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();
}
}
Aufbau:
@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;
}
}
Ressourcenserver-Konfiguration:
@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
}
}
Möglicherweise liegt das Problem in der YAML-Konfiguration. Wenn Sie "Starters" verwenden, wird SnakeYAML automatisch über spring-boot-starter
bereitgestellt. Wenn nicht, müssen Sie die Eigenschaften-Konvention in application.properties verwenden. /. Verwenden von YAML anstelle von Eigenschaften
EDIT: Versuchen Sie es in Ihrer Yml-Datei:
server:
compression:
enabled: true
mime-types: text/html,text/xml,text/plain,text/css,application/javascript,application/json
min-response-size: 1024
Wenn Sie nicht eingebettetes Tomcat verwenden, sollten Sie dies zu Ihrer server.xml hinzufügen:
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,application/javascript"
Hast du es mit verschiedenen Browsern probiert? Dies könnte an einem Antivirenprogramm liegen, das die Datei entpackt, wie in SO post Spring Boot http-Antwortkomprimierung erwähnt. Bei einigen User-Agents funktioniert die Komprimierung nicht.
Mit der Spring Boot-Komprimierung hatte ich nie viel Glück. Eine einfache Lösung könnte die Verwendung einer Drittanbieter-Bibliothek wie Ziplet sein.
Fügen Sie zu pom.xml hinzu
<dependency>
<groupId>com.github.ziplet</groupId>
<artifactId>ziplet</artifactId>
<version>2.0.0</version>
<exclusions>
<exclusion>
<artifactId>servlet-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>
</exclusions>
</dependency>
Fügen Sie Ihrer @Config-Klasse hinzu:
@Bean
public Filter compressingFilter() {
return new CompressingFilter();
}
sie müssen ssl aktivieren. Wie der http2-Modus kann die Antwortkomprimierung (Content-Encoding) funktionieren, wenn der ssl-Modus konfiguriert ist .
application.yml
server:
compression:
enabled: true
mime-types: text/html,text/xml,text/plain,text/css, application/javascript, application/json
min-response-size: 1024
ssl:
enabled: true
key-store: keystore.p12
key-store-password: pass
keyStoreType: PKCS12
keyAlias: name
spring:
resources:
chain:
gzipped: true