webentwicklung-frage-antwort-db.com.de

Spring Boot Response Compression funktioniert nicht

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.

 enter image description here

=== 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... :(

 Printing the Compression object at o.s.b.a.w.ServerProperties line 180

=== 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
    }
}
21
Quan Ding

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
2

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"

Weitere Tomcat 8-Konfigurationsvariablen

2

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.

1
abaghel

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();
}
1
Gandalf

sie müssen ssl aktivieren. Wie der http2-Modus kann die Antwortkomprimierung (Content-Encoding) funktionieren, wenn der ssl-Modus konfiguriert ist .  Content-Encoding:gzip

antwortkomprimierung

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
0
s.a.hosseini