当前位置: 首页 > 知识库问答 >
问题:

Spring启动响应压缩不工作

甄越
2023-03-14

我有一些javascript捆绑文件,非常大,大约1MB。我正在尝试使用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

===编辑3===进一步遵循@Chimmi的建议。我已经在建议的地方设置了断点。对静态资源(js文件)的请求似乎从未在这些断点停止过。只有rest API请求才会这样做。对于这些请求,由于某种原因,内容长度为零,这导致跳过内容压缩。

由于@Chimmi的建议,我在O.S.B.a.W.ServerProperties的第180行设置了一个断点,它显示所有属性都设置好了,但不知何故服务器没有遵守这个设置...:(

===编辑1===

@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
    }
}

共有1个答案

楚茂实
2023-03-14

也许问题出在YAML配置上。如果您使用“starters”,SnakeYAML将通过spring-boot-starter自动提供。如果不这样做,则必须在application.properties中使用properties约定。使用YAML代替属性

编辑:在您的yml文件中尝试:

server:
      compression:
        enabled: true
        mime-types: text/html,text/xml,text/plain,text/css,application/javascript,application/json
        min-response-size: 1024
 类似资料:
  • 问题内容: 我正在使用php的功能来执行HTTP请求。为了节省带宽,我决定使用添加标题。 显然,输出一个gzip编码的字符串,所以我用来解码该编码的字符串,但是将作为参数传递的数据出错。 我知道还有另一个功能可以解压缩压缩后的数据,但是它不包含在我的PHP版本中(也许仅在SVN上可用)。 我知道cUrl可以即时解码gzip流(没有任何问题),但是有人建议我使用它而不是cUrl。 您是否知道以其他方

  • 我在部署带有Spring启动的 react nodejs 应用程序时遇到问题。Spring应用程序在基本的HTML / JS中工作正常,并且我已经使react应用程序在开发模式下运行良好,但是我似乎缺少一些东西,即正确捆绑反应和Spring。 目前,我可以使用一些简单的HTML和javax调用来运行/部署我的Spring启动应用程序(没有反应)。它在我的 AWS ec2 上运行,没有问题。 我还可

  • 我最近开始使用,发现它非常有趣。由于我的大多数应用程序都在中,我决定使用团队提供的spring boot starter项目进行快速设置。它附带了autoconf-spring设置,这使得查询endpoint更加容易。 在IDEA中花了几个小时进行项目设置后,我能够运行graphql示例应用程序。但我认为我的servlet仍然没有启用,只有endpoint正在运行,因为默认查询返回。 这是: 这就

  • 问题内容: 我有一个用rails编写的api,它在每个请求上均以JSON响应进行响应。 响应可能很大,因此我需要使用gzip压缩JSON响应。 想知道如何在Rails控制器中执行此操作? 我加了线 在config.ru中 我还应该在呈现JSON的行中更改某些内容吗? 另外,我如何检查响应是否为gzip格式。 我从终端发出了curl请求,我只看到普通的普通JSON。 问题答案: 对于以gzip格式的

  • 我正在使用Camel的RESTendpoint来实现HTTPendpoint。我想在响应上启用HTTP有效负载压缩,但还没有找到实现它的方法。如果我向路由中添加位,它确实会压缩有效负载,但我最终会得到一个压缩文件! 有人设法在Camel中实现HTTP压缩吗? 非常感谢。 美联社

  • 我正在尝试在Spring boot web应用程序上启用http响应压缩。它适用于某些用户代理,但由于某些原因,它不适用于其他用户代理(具体情况如下)。 我的基本问题是:为什么Spring Boot中的http响应压缩(gzip)只对某些用户代理头有效,以及它是在哪里配置的。 Spring引导参考没有说任何关于它。 我准备了支持压缩的简单web应用程序:示例spring-boot-compress