HandlerExecutionChain是一个执行链,从HandlerMapping(处理器映射器)返回给DispatcherServlet(前端控制器),其中包含了Handler对象和拦截器Interceptor对象(数组),SpringMVC的拦截器接口定义了3个方法:
1、preHandler:调用Handler之前执行
2、postHandler:调用Handler之后执行
3、afterCompletion:视图渲染完成之后执行
拦截器的执行过程:
拦截器是顺序执行,按图从左到右,先执行拦截器中的preHandler方法,一直执行到Handler处理业务逻辑,处理完Handler之后,按上图再倒叙的执行拦截器postHandler方法。
自定义拦截器的实现:
自定义拦截器:
package com.its.springmvc.interceptors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 自定义拦截器
*/
public class MyHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("--------MyHandlerInterceptor的前置方法执行了----------");
/**
* true:放行通过
* false:拦截不通过
*/
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("--------MyHandlerInterceptor的后置方法执行了----------");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("--------MyHandlerInterceptor的视图渲染完成方法执行了----------");
}
}
在springmvc配置文件中配置拦截器:
配置多个自定义拦截器:
拦截器总结:
1、拦截器的执行过程和Struts2的拦截器执行过程类似。
2、拦截器的前置方法是顺序执行,如果其中一个返回false则请求被拦截(不通过)。
3、拦截器的后置方法是倒序执行,后置方法只有在前置方法全部执行后才能被执行。
4、拦截器的完成方法是倒序执行,完成方法不仅是在最后执行,而且如果前置方法返回false,也会被执行(已经通过执行的拦截器的完成方法)。
SpringMVC拦截器执行顺序源码分析:
1、拦截器的前置方法是正序执行
2、拦截器的后置方法是倒序执行
3、拦截器的完成方法是倒序执行