您的位置:首页 > 科技 > IT业 > 请你谈谈:spring拦截器的应用-preHandle postHandle afterCompletion执行顺序问题的讨论?

请你谈谈:spring拦截器的应用-preHandle postHandle afterCompletion执行顺序问题的讨论?

2024/10/6 2:30:03 来源:https://blog.csdn.net/zs18753479279/article/details/140837462  浏览:    关键词:请你谈谈:spring拦截器的应用-preHandle postHandle afterCompletion执行顺序问题的讨论?

首先我们,给出一个demo来看下拦截器方法执行顺序:

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component
public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("1-1 preHandle: ");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("2-1 postHandle: ");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("3-1 afterCompletion: ");}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebmvcConfig implements WebMvcConfigurer {@Autowiredprivate MyInterceptor myInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(myInterceptor);}
}
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@GetMapping("/hello")public String hello() {System.out.println("controller:");return "hello, zhaoshuai-lc";}
}

在这里插入图片描述
在Spring MVC中,拦截器(Interceptor)的三个主要方法preHandlepostHandleafterCompletion的执行顺序是严格规定的,这些方法的执行时机和顺序对于理解Spring MVC的请求处理流程至关重要。以下是这三个方法的执行顺序的详细解释:

执行顺序

  1. preHandle

    • 调用时间:该方法在请求处理之前执行,即Controller方法调用之前。
    • 执行顺序:如果有多个拦截器,它们会按照配置的顺序(即拦截器数组中的正向顺序)依次执行。
    • 返回值
      • 返回true:表示当前拦截器处理通过,请求会继续传递给下一个拦截器(如果有的话),或者如果没有其他拦截器了,就会传递给Controller处理。
      • 返回false:表示当前拦截器拦截请求,不会继续执行后续的拦截器或Controller方法,而是直接中断执行流程,并会根据情况(如配置)执行afterCompletion方法(但需要注意的是,不是所有返回false的拦截器都会执行afterCompletion,这取决于拦截器的具体配置和是否发生异常)。
      • 在这里插入图片描述
        在这里插入图片描述
  2. postHandle

    • 调用前提preHandle方法必须返回true,即请求被正常放行到Controller方法执行之后,但在DispatcherServlet进行视图渲染之前。
    • 调用时间:Controller方法处理完请求并返回ModelAndView之后,但在视图渲染之前。
    • 执行顺序:如果有多个拦截器,它们会按照配置的逆序(即拦截器数组的反向顺序)执行。
    • 注意:如果Controller方法执行过程中抛出异常,将跳过postHandle方法,直接执行afterCompletion方法。

总结

方法名调用时机执行顺序(多个拦截器时)主要作用
preHandle请求处理之前,Controller方法调用之前正向顺序决定是否继续执行后续的拦截器或Controller
postHandleController方法处理完请求后,视图渲染前反向顺序(如果执行)对ModelAndView进行操作(如果需要)
afterCompletion(错误说法)整个请求处理结束之后,包括视图渲染之后反向顺序资源清理工作,如关闭数据库连接等

这个执行顺序和规则是Spring MVC框架中拦截器机制的核心,理解和掌握它们对于开发高质量的Web应用至关重要。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com