关注我的公众号:【编程朝花夕拾】,可获取首发内容。

01 引言
接上一节分享的方法configureAsyncSupport、configureDefaultServletHandling以及addFormatters。我们总共已经分享了5个方法了,我们继续分享接下的两个方法:
addInterceptorsaddResourceHandlers
02 方法6
addInterceptors
java
default void addInterceptors(InterceptorRegistry registry) {
}
作用:注册自定义拦截器,用于在请求处理前后执行特定逻辑。
使用场景:
- 权限验证
- 日志记录
- 性能监控
- 跨域处理
2.1 使用说明
注册自定义拦截器,注册的拦截器有两种:
org.springframework.web.servlet.HandlerInterceptororg.springframework.web.context.request.WebRequestInterceptor

在Spring框架中,WebRequestInterceptor和HandlerInterceptor都是用于拦截请求的接口,但它们在使用和功能上有一些区别。
参数不同:
WebRequestInterceptor的preHandle、postHandle和afterCompletion方法接收一个WebRequest参数,这个WebRequest是Spring的一个抽象,它封装了Servlet的HttpServletRequest和HttpServletResponse,并且提供了一些额外的功能。HandlerInterceptor的相应方法则直接接收HttpServletRequest、HttpServletResponse和Object(处理器对象)作为参数。
使用场景:
WebRequestInterceptor更侧重于对WebRequest进行操作,它不依赖于Servlet API,因此可以在非Servlet环境中使用(例如Portlet)。但是,在典型的Spring MVC应用中,我们通常使用HandlerInterceptor。HandlerInterceptor是Spring MVC中更常用的拦截器,它直接与Servlet API耦合,提供了更直接的访问到请求和响应对象。
功能:
WebRequestInterceptor的preHandle方法没有返回值,因此不能中断请求,只能进行一些前置处理。而HandlerInterceptor的preHandle方法返回一个boolean值,如果返回false,则中断请求,不再执行后续的拦截器和处理器。HandlerInterceptor提供了更细粒度的控制,可以在请求处理之前、之后以及完成之后(视图渲染之后)进行拦截。
用的更多的是HandlerInterceptor。
2.2 定义拦截器
HandlerInterceptor
java
@Slf4j
public class ApiInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("ApiInterceptor preHandle 执行了...");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("ApiInterceptor postHandle 执行了...");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("ApiInterceptor afterCompletion 执行了...");
}
}
WebRequestInterceptor
java
@Slf4j
public class WebApiInterceptor implements WebRequestInterceptor {
@Override
public void preHandle(WebRequest request) throws Exception {
log.info("WebApiInterceptor preHandle 执行了...");
}
@Override
public void postHandle(WebRequest request, ModelMap model) throws Exception {
log.info("WebApiInterceptor postHandle 执行了...");
}
@Override
public void afterCompletion(WebRequest request, Exception ex) throws Exception {
log.info("WebApiInterceptor afterCompletion 执行了...");
}
}
2.3 配置
java
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new ApiInterceptor())
// 拦截路径
.addPathPatterns("/**")
// 排除路径
.excludePathPatterns("/test/**");
registry.addWebRequestInterceptor(new WebApiInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/test/**");
}
可以配置拦截的路径,也可以配置忽略的路径。
2.4 测试效果

执行的顺序和注册的顺序一致,还可以相互传递参数。但是平时开发中我们用一种就够了。
03 方法7
addResourceHandlers
java
default void addResourceHandlers(ResourceHandlerRegistry registry) {
}
作用:配置静态资源映射路径和缓存策略。
使用场景:
- 自定义静态资源路径
- 前端资源托管
2.1 使用说明

ResourceHandlerRegistry可操作的就是addResourceHandler和setOrder()方法,分别用来映射静态资源的路径以及顺序。
例如,静态资源的路径为:/source/1.txt,我们就需要配置ResourceHandler:
java
registry.addResourceHandler("/source/**")
这就意味着source下面代表着静态资源。但是现在还无法访问,还需要指定静态资源的位置:
java
registry
.addResourceHandler("/source/**")
.addResourceLocations("classpath:/files/") ;
图中为静态文件的实际位置:

2.2 配置
java
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/source/**")
.addResourceLocations("classpath:/files/");
}
2.3 测试效果

结果确实访问到了。但是如果不配置,就无法直接访问。
2.4 特别说明

通过源码我们能够看到SpringBoot框架开放一批静态资源可以直接访问:
classpath:/META-INF/resourcesclasspath:/resources/classpath:/static/classpath:/public/
通过测试依次访问的顺序是:
- ①
classpath:/META-INF/resources - ②
classpath:/static/ - ③
classpath:/public/ - ④
classpath:/resources/
访问的路径不需要前缀,访问路径下的资源即可。

还可以通过配置文件追加或者修改:

properties
spring.web.resources.static-locations=classpath:/files/
04 小结
今天介绍的这两个方法比较简单,但是非常实用,项目中会经常遇到。愿今天的分享,能够给你带来帮助,下一节我们继续介绍其他方法。