关于SpringMVC中拦截器方法的执行顺序问题

关于SpringMVC中拦截器方法的执行顺序问题

一、拦截器(实现HandlerInterceptor接口)所包含的方法以及作用
1.preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
* DispatcherServlet在调用目标方法(mv = ha.doHandle())之前,会调用(mappedHandler.applyPreHandle)这个方法,
* 相当于预处理请求,这个地方应该可以对不合法或者别的请求进行判断,然后如果不想做出响应则返回false即可,
* 该方法在目标方法之前被调用,若返回值会true则继续调用后续的拦截器和目标方法,
* 若返回值为false则不会再调用后续的拦截器和目标方法
*
* 作用:可以考虑做权限,日志,事务等
2. postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
* 在DispatcherServlet执行mappedHandler.applyPostHandle时调用
* 这个方法是在处理完请求(目标方法)之后,做出响应(response)之前或者说渲染视图之前被调用
*
* 作用:可以对请求域中的属性或视图做出修改
3 afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
* 在DispatcherServlet执行mappedHandler.applyAfterConcurrentHandlingStarted时调用
* 这个方法在 DispatcherServlet 完全处理完请求(渲染视图)后被调用,可以在该方法中进行一些资源清理的操作
*
* 作用:释放资源

二、拦截器方法执行顺序:

  • preHandle->handle(处理请求)->postHandle->render(渲染视图)->afterCompletion
  • 当有多个(以2个为例子)自定义拦截器时这些方法的执行顺序为:
  • First#preHandle->Second#preHandle->handle->Second#postHandle->First#postHandle
    ->render->Second#afterCompletion->First#afterCompletion
  • First和Second分别表示自定义拦截器配置的顺序,这也就是说
  • preHandle方法按自定义拦截器配置的正序执行,而postHandle和afterCompletion方法按自定义拦截器配置的倒序执行
  • 如果在Second#preHandle方法返回false,此时后边的目标方法以及拦截器方法都不执行,
    但是在最后会执行一个First#afterCompletion方法,来对First#preHandle的资源进行释放,
  • 在afterCompletion进行循环执行时的最大个数为intercetorIndex(需要释放几个自定义拦截器的资源)指的就是在某一个自定义拦截器的preHandle方法返回false之前执行了多少个自定义拦截器的preHandle方法(因为在执行自定义拦截器之外还会执行ConversionServiceExposingInterceptor(类型转换拦截器), 执行自定义拦截器之后还会执行LocaleChangeInterceptor(国际化拦截器))

猜你喜欢

转载自blog.csdn.net/sinat_38848255/article/details/107255946