Spring Boot静态资源引用问题

前言

在使用Spring Boot时,将静态资源文件都放到了resources下的static下了。前端<src=“@{js/xxx/xx.js}”>这样引用。在一般情况下,写一个controller,且访问url只有一层,访问localhost:8080/xxx 时资源访问都是正常的。但是如果url有两层,或两层以上时,如:localhost:8080/xxx/xxx 时,竟然诡异的出现了静态资源404。
这让我百思不得其解。。。
随便一提
Spring Boot版本为1.5.14.RELEAS
前端使用Thymeleaf作为模版引擎。

正文

为解决以上问题。通过其不断的googel,终于找到解决方案,遂记之。。
因为使用的是spring boot默认的静态资源加载器:WebMvcAutoConfiguration
会从
/META-INF/resources/,
/resources/,
/static/,
/public/
目录映射静态资源文件。

如果Spring Boot 提供的配置不符合我们的需求时,比如我上面的情况,就可以自定义一个静态资源目录。我们需要一个WebMvcConfigurerAdapter这个类。重写该类的addResourceHandlers方法。

/**
 * 配置文件类
 */
@Configuration
public class PcbWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {

    /**
     * 配置静态访问资源
     *
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/js/**",
                "/css/**",
                "/img/**",
                "/fonts/**")
                .addResourceLocations(
                        "classpath:/static/js/",
                        "classpath:/static/css/",
                        "classpath:/static/img/",
                        "classpath:/static/fonts/");
    }
}

在页面上就需要用这样方式引用静态资源

<link rel="stylesheet" th:href="@{/css/retrieve_pwd.css}">

参考

Spring Boot干货系列:(六)静态资源和拦截器处理