Spring启动静态文件加载缓慢

时间:2014-07-07 14:53:42

标签: java spring spring-boot

我有一个春季启动应用程序。当我将其部署到远程服务器并使用嵌入式tomcat运行时,我的静态文件加载速度非常慢。例如,加载50行js文件大约需要7秒钟。它是一个非常标准的Spring MVC应用程序。我的主要看起来像这样

package com.mineiq;

import javax.servlet.MultipartConfigElement;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.context.embedded.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;


@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

    @Bean
    MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        factory.setMaxFileSize("128MB");
        factory.setMaxRequestSize("128MB");
        return factory.createMultipartConfig();
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

例如,我的主页只是提供静态html页面,因此几乎没有服务器端负载。我试过禁用spring-security,但它没有帮助。

仅当我在远程服务器上运行应用程序时才会发生这种情况。在当地,一切都很快。

我单独配置nginx以在不同的端口上提供静态文件,并且它很快就能为它们服务,所以问题不在于服务器本身。这只是一个测试(不是解决方案),因为我真的不想为静态文件运行单独的服务器。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以查看的一些提示:

首先尝试直接在网址中点击资源。

确保您没有在应用程序(http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/mvc.html#mvc-default-servlet-handler)中启用默认的servlet处理程序,以便容器的默认Servlet不提供静态资源。

默认情况下,Spring Boot将从类路径中的/ static(或/ public或/ resources或/ META-INF / resources)文件夹或ServeltContext的根目录中提供静态内容。它使用ResourceHttpRequestHandler,通过提供的缓存设置优化静态内容交付。

如果您想为静态内容添加除上述默认内容之外的其他位置,您可以通过添加自己的WebMvcConfigurerAdapter并覆盖addResourceHandlers方法来实现,如下所示:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.examples.mvc.base.controller" })
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets/");
    }

}

更多信息:

答案 1 :(得分:0)

您应该允许浏览器缓存静态资源,方法是使用setCachePeriod()设置缓存周期,请看以下示例:

@Configuration
@EnableWebMvc
@EnableScheduling
@ComponentScan(basePackages = "your.site")
public class ConfigWebMvc extends WebMvcConfigurerAdapter implements WebApplicationInitializer {

@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/").setCachePeriod(31556926);
}