SpringBoot静态资源映射的默认规则

静态资源映射指的是当用户发出请求的时候,服务器端应该按照哪些规则查找静态资源返回给用户。
以下是springboot默认的资源映射规则

  • webjars:以jar包的方式引入外部静态资源
    当发起所有/webjars/**请求时,springboot会去classpath:/META-INF/resources/webjars/下找资源。

    例如:springboot中引入jquery的maven依赖
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>3.4.1</version>
        </dependency>
        
    当我们访问http://localhost:8081/webjars/jquery/3.4.1/jquery.js请求时
    我们就需要在classpath:/META-INF/resources/webjars/下找我们导入的jquery资源
    我们需要在WebMvcConfigurer实现类中配置资源映射信息
    
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    	registry.addResourceHandler("/webjars/**")
    		.addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
  • 如果访问的是自己项目的一些静态资源,不是访问以jar形式导入的静态资源

    springboot默认按照以下路径,按顺序查找资源文件
    "classpath:/META‐INF/resources/", 
    "classpath:/resources/",
    "classpath:/static/",
    "classpath:/public/"
    "/":当前项目的根路径
    
    其中classpath表示的是类路径,springboot项目的java和resources目录都是类路径,都是classpath下,
    例如:"classpath:/static/"指的是在java目录下和resources目录下,即"/"下
    查找static文件夹,该文件夹作为静态资源文件,/表示的是根目录,即以java目录下和resources目录开始查找
    
    默认情况下,resources目录下的public文件夹,resources文件夹,static文件夹都是静态资源文件夹
    如果想自定义静态资源路径,可以在springboot.properties中配置:
        # 自定义静态资源访问路径,可以指定多个,之间用逗号隔开
        spring.resources.static-locations=classpath:/myabc/,classpath:/myhhh
    当指定了静态资源访问路径后,默认的资源资源路径就不起作用了
  • 首页index.html,被/**映射
    指的是当首页index.html文件放置在静态文件目录中,即resources目录下的static,resources,public下
    springboot便会自动映射到该首页文件,例如发出http://localhost:8080请求时,springboot自动映射
    在静态资源目录中查找index.html文件。

  • 自定义图标
    跟index.html映射类似,只要将网站图标放置在默认的静态资源文件下,即static,resources,public下
    便会自动映射该图标文件,前提是该图标命名是favicon.ico

  • 以上是springboot默认的映射规则,我们还可以配置一些自己的映射规则,只需要实现WebMvcConfigurer
    接口,并重写addResourceHandlers即可,另外如果是项目中资源,映射规则都是以”classpath”开头
    如果是映射绝对路径,本机的某个地址,例如文件上传映射到电脑某个盘,则需要以”file”开头。

自定义拦截器

public class MyHandlerInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 
                             Object handler) throws Exception {
        System.out.println("拦截器方法:preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, 
                           Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("拦截器方法:postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
                                Object handler, Exception ex) throws Exception {
        System.out.println("拦截器方法:afterCompletion");
        if (ex!=null){
            System.out.println("异常:"+ex.getMessage());
        }
    }
}

注册拦截器进容器

@Component
public class MyConfig {

    /*配置WebMvcConfigurer,定制化SpringMVC的功能*/
    @Bean
    public WebMvcConfigurer webMvcConfigurer(){
        return new WebMvcConfigurer() {
            /*注册自定义拦截器*/
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                /*
                    addPathPatterns("/**") 指定拦截的请求路径
                    excludePathPatterns("/static/**") 指定放行的请求路径,
                    当这些请求来到时,不经过拦截器
                */
                registry.addInterceptor(new MyHandlerInterceptor())
                    .addPathPatterns("/**").excludePathPatterns("/images/**","/");
            }
        };
    }
}