简介
Spring MVC拦截器是Spring框架中的一种组件,用于对请求进行拦截和处理。拦截器可以在请求到达控制器之前或之后进行处理,拦截器可以用于实现一些通用的功能,比如身份验证、日志记录、性能监控等。
拦截器的参数
request:请求对象,response:响应对象,handler:被调用的处理器对象, ex:异常处理对象
配置一个拦截器需要实现WebMvcConfigurer和HandlerInterceptor
@Component
public class WebConfig implements WebMvcConfigurer {
@Autowired
InterceptorDemo1 interceptorDemo1;
@Autowired
InterceptorDemo2 interceptorDemo2;
@Autowired
InterceptorDemo3 interceptorDemo3;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(interceptorDemo1).addPathPatterns("/hello");
registry.addInterceptor(interceptorDemo2).addPathPatterns("/hello");
registry.addInterceptor(interceptorDemo3).addPathPatterns("/hello");
}
}
@Component
public class InterceptorDemo implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
System.out.println("preHandle1执行了");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
{
System.out.println("postHandle1执行了");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
{
System.out.println("afterCompletion1执行了");
}
}
@Component
public class InterceptorDemo implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
System.out.println("preHandle2执行了");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
{
System.out.println("postHandle2执行了");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
{
System.out.println("afterCompletion2执行了");
}
}
@Component
public class InterceptorDemo implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
System.out.println("preHandle3执行了");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
{
System.out.println("postHandle3执行了");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
{
System.out.println("afterCompletion3执行了");
}
}
控制器:
@Controller
public class TestController {
@RequestMapping("/hello")
public String testInterceptor() {
System.out.println("控制器中的方法执行了。。。");
return "success";
}
}
拦截器执行顺序
preHandle:与配置顺序相同,必定运行postHandle:与配置顺序相反,不一定运行 ,afterCompletion:与配置顺序相反,不一定运行,preHandle返回值为false,后面的拦截器将不再执行。
1、2、3均返回true运行结果:
1、3返回true,2返回false运行结果: