Spring HandlerInterceptor、Spring AOP、Servlet Filter 三者的区别及源码解析
一:执行顺序
Servlet Filter🠒HandlerInterceptor🠒Aop
二:源码解析
(一)Spring Interceptor
spring提供了一个HandlerInterceptor接口 ,其中包含三个方法 预处理preHandle()方法 , 后处理postHandle()方法 和 返回处理afterCompletion()方法
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
1)(预处理)preHandle 方法
Spring HandlerInterceptor、Spring AOP、Servlet Filter 三者的区别及源码解析用户发出请求时,会先按照顺序执行所有拦截器的preHandle方法,如果方法 return true;则继续执行用户请求的执行链,如果是return false 则停止后面的执行链。
2)(后处理)postHandle方法
用户逻辑代码执行完毕后,在进行视图渲染之前执行此方法。可在此方法中对视图、 数据做逻辑修改。
3)(返回处理)afterCompletion方法
此方法仅仅只会在前面所有的执行链成功执行完成之后才会被调用,且该方法将在链中的每个拦截器上按相反的顺序调用,因此第一个拦截器将是最后一个被调用的。
在springMvc中 用户发起的所有请求都会在DispatcherServlet中进行处理,DispatcherServlet的角色就相当于是调度控制中心,它的作用就是找到每个需要参与的角色,按次序调用每个角色进行处理,HandlerInterceptor就是其中一个角色。
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
boolean multipartRequestParsed = false;
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
try {
ModelAndView mv = null;
Exception dispatchException = null;
try {
processedRequest = checkMultipart(request);
multipartRequestParsed = (processedRequest != request);
// 找到当前处理器映射器
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null) {
//如果没有找到就会保 No mapping for....控制器 并终止后续的执行。
noHandlerFound(processedRequest, response);
return;
}
// 根据映射器找到当前对应的处理适配器
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// 如果处理程序支持,则处理最后修改的报头。
String method = request.getMethod();
boolean isGet = "GET".equals(method);
if (isGet || "HEAD".equals(method)) {
long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
return;
}
}
//如果执行链应该继续执行下一个拦截器或处理程序本身,则应用已注册拦截器的preHandle方法。 否则,DispatcherServlet假定这个拦截器已经处理了响应本身。
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
return;
}
// 处理器适配器实际调用处
mv = ha.handle(processedRequest, response, mappedHandler.