interceptor 拦截器源码解读
拦截器执行时的源码分析
拦截器顶层接口 HandlerInterceptor
DispatcherServlet#doDispatch
在调度接口之前会先执行拦截器的 preHandle
方法,如下:
// 变量 mappedHandler 的类型是 HandlerExecutionChain
// 执行所有拦截器的前置方法
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
return;
}
// 实际上调用的处理程序
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
if (asyncManager.isConcurrentHandlingStarted()) {
return;
}
applyDefaultViewName(processedRequest, mv);
// 执行所有拦截器的后置方法
mappeandler.applyPostHandle(processedRequest, response, mv);
调用拦截器的类 HandlerExecutionChain
boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {
// this.interceptorList 拦截器列表
for (int i = 0; i < this.interceptorList.size(); i++) {
HandlerInterceptor interceptor = this.interceptorList.get(i);
// preHandle 拦截器执行
if (!interceptor.preHandle(request, response, this.handler)) {
triggerAfterCompletion(request, response, null);
return false;
}
this.interceptorIndex = i;
}
return true;
}
将拦截器添加到拦截器列表的方法
- 实现
WebMvcConfigurer
中的addInterceptors
方法 InterceptorRegistry#addInterceptor
方法是将拦截器添加到拦截器列表中InterceptorRegistry#addPathPatterns
是拦截规则
@Configuration
public class WebMvcInterceptorConfig implements WebMvcConfigurer {
@Resource
private PermissionInterceptor permissionInterceptor;
@Resource
private CookieInterceptor cookieInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(permissionInterceptor).addPathPatterns("/**");
registry.addInterceptor(cookieInterceptor).addPathPatterns("/**");
}
}