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/**","/");
}
};
}
}