Spring Boot acessa recurso estático CSS JS não consegue encontrar 404

Normalmente não escrevo páginas front-end. Hoje escrevi freemarker como um arquivo de modelo. Ao usar o Spring Boot, encontrei o problema de não conseguir acessar arquivos estáticos, como css e js. Verifiquei o console do navegador e encontrei um erro 404. O Baidu deu uma olhada. Existem muitos Eu uso Spring Boot para acessar recursos estáticos, mas não consigo acessá-los. O exemplo de 404 é relatado. Acho que muitos exemplos não são detalhados o suficiente. Escreva um blog aqui como um registro. Em primeiro lugar, você precisa declarar que diferentes versões do Spring Boot podem ter soluções diferentes. A versão Spring Boot deste blog é 2.0.x. Vamos começar com o projeto. Todos os recursos estáticos são colocados no diretório classpath: / static /, os recursos freemarker são colocados no diretório classpath: / templates e, em seguida, Spring Boot é iniciado. Ao acessar uma página da web, o aplicativo relata que css e js não podem ser encontrados. O acesso a recursos estáticos no Spring Boot envolve ResourceHandler e ResourceLocations. Podemos ver seus valores padrão visualizando o código-fonte:

@ConfigurationProperties(prefix = "spring.resources", ignoreUnknownFields = false)
public class ResourceProperties {
    private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/" };
    private String[] staticLocations = CLASSPATH_RESOURCE_LOCATIONS;
}
@ConfigurationProperties(prefix = "spring.mvc")
public class WebMvcProperties {
    private String staticPathPattern = "/**";
}

A seguir está o arquivo css configurado na página HTML no momento. Os dois acessos de configuração a seguir relatam um erro 404. Neste momento, me sinto um pouco irracional. Em primeiro lugar, nossos recursos estáticos são colocados no caminho padrão do SpringBoot, e o modo de análise de recurso estático também é o caminho padrão. . Mas não importa como você o acessa, é um erro 404.

<link href="layui/css/layui.css" rel="stylesheet" >
<link href="static/layui/css/layui.css" rel="stylesheet" >

Frustrado, tive que configurar manualmente o caminho e o modo de correspondência dos recursos estáticos. Esta versão herda WebMvcConfigurationSupport e substitui o método addResourceHandlers. O código é o seguinte:

@Configuration
public class MvcConfig extends WebMvcConfigurationSupport {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
        super.addResourceHandlers(registry);
    }
}

Neste ponto, vamos configurar o recurso estático como <link href = "layui / css / layui.css" rel = "stylesheet">, bem, o recurso estático pode ser acessado, mas se usarmos o código a seguir, o recurso estático será novamente Não consigo acessar, o código é o seguinte:

@Configuration
public class MvcConfig extends WebMvcConfigurationSupport {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        super.addResourceHandlers(registry);
    }
}

Se você usar o código acima, precisará usar o seguinte método de introdução, ou seja, você precisará adicionar estático, <link href = "static / layui / css / layui.css" rel = "stylesheet">. Vendo isso, podemos entender a função de ResourceHandler e ResourceLocations. ResourceLocations configura a localização de recursos estáticos. Se você estiver acessando recursos estáticos, encontrará recursos desse local. ResourceHandler representa o modo de correspondência de recursos estáticos, ou seja, recursos estáticos são acessados ​​quando os recursos no caminho / static / ** são acessados. O que é um pouco confuso aqui é que o modo de correspondência padrão da configuração do Spring Boot é / **, por que precisamos reescrever a configuração do método / ** modo de correspondência. Se você não consegue encontrar as respostas para algumas perguntas, ler o código-fonte é a melhor escolha. A configuração automática do Spring MVC do Spring Boot está na classe WebMvcAutoConfiguration no pacote org.springframework.boot.autoconfigure.web.servlet. Vamos primeiro dar uma olhada em sua definição:

@Configuration
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,
		ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
}

Há uma anotação na definição acima: @ConditionalOnMissingBean (WebMvcConfigurationSupport.class), o que significa que quando uma instância de WebMvcConfigurationSupport existe no contêiner Spring IOC, WebMvcAutoConfiguration não será instanciado. Abaixo, estamos analisando o que essas duas classes fizeram.

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    //获取匹配模式 默认为/**
    String staticPathPattern = this.mvcProperties.getStaticPathPattern();
    if (!registry.hasMappingForPattern(staticPathPattern)) {
       //配置静态资源的匹配模式,配置静态资源的位置
customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern)
.addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations())
.setCachePeriod(getSeconds(cachePeriod))
.setCacheControl(cacheControl));
    }
}

Em seguida, verifique o código-fonte e descubra se há uma classe DelegatingWebMvcConfiguration que herda WebMvcConfigurationSupport. O código é o seguinte:

@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
}

Comentamos o MvcConfig que escrevemos e, em seguida, escrevemos uma classe de teste para determinar se DelegatingWebMvcConfiguration está em SpringIOC. O código é o seguinte:

@Component
public class Test implements CommandLineRunner {
    @Autowired
    private ApplicationContext context;
    @Override
    public void run(String... args) throws Exception {
        System.out.println(context.getBean(DelegatingWebMvcConfiguration.class));
    }
}

org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration$$EnhancerBySpringCGLIB$$af9294ec@7a9c84a5, o resultado impresso é como acima, pode ser visto que o contêiner ainda não está usando a instância de WebMvcuto, finalmente não há mais uso do WebMvcuto. IDEA maven clean, está tudo bem. Há um ponto de interrogação preto? Aqui também está uma solução. Quando Spring Boot não pode acessar recursos estáticos e não há nenhum problema com a configuração, você pode muito bem limpar maven ou substituí-lo por eclipse, caso contrário Basta reiniciar o editor, reimportar o projeto, etc. Enfim, é uma dor de cabeça. Recomenda-se usar o esquema de colocação de recursos oficialmente fornecido pelo Spring Boot, ou seja, os arquivos de modelo são colocados em classpath: / templates e os recursos estáticos são colocados em "classpath: / META-INF / resources /" ou "classpath: / resources /", " classpath: / static / ",," classpath: / public / ". A correspondência de padrões de recursos estáticos pode usar o padrão / ** ou personalizar o padrão. É recomendado usar / ** aqui. Não precisamos personalizar WebMvcConfigurationSupport. Finalmente, faça uma captura de tela do diretório onde os recursos oficialmente recomendados pelo Spring Boot estão localizados:

Acho que você gosta

Origin blog.csdn.net/wk19920726/article/details/108883768
Recomendado
Clasificación