SpringBoot拦截器和动态代理有什么区别?


SpringBoot拦截器和动态代理有什么区别?

文章插图
在 Spring Boot 中,拦截器和动态代理都是用来实现功能增强的,所以在很多时候 , 有人会认为拦截器的底层是通过动态代理实现的,所以本文就来盘点一下他们两的区别,以及拦截器的底层实现 。
1、拦截器拦截器(Interceptor)准确来说在 Spring MVC 中的一个很重要的组件,用于拦截 Controller 的请求 。它的主要作用有以下几个:
  • 权限验证:验证用户是否登录、是否有权限访问某个接口 。
  • 日志记录:记录请求信息的日志,如请求参数,响应信息等 。
  • 性能监控:监控系统的运行性能,如慢查询接口等 。
  • 通用行为:插入一些通用的行为,比如开发环境忽略某些请求 。
典型的使用场景是身份认证、授权检查、请求日志记录等 。
(1)拦截器实现在 Spring Boot 中拦截器的实现分为两步:
  • 创建一个普通的拦截器,实现 HandlerInterceptor 接口,并重写接口中的相关方法 。
  • 将上一步创建的拦截器加入到 Spring Boot 的配置文件中,并配置拦截规则 。
具体实现如下 。
实现自定义拦截器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;@Componentpublic class TestInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("拦截器:执行 preHandle 方法 。");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("拦截器:执行 postHandle 方法 。");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("拦截器:执行 afterCompletion 方法 。");}}其中:
  • boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handle):在请求方法执行前被调用,也就是调用目标方法之前被调用 。比如我们在操作数据之前先要验证用户的登录信息 , 就可以在此方法中实现 , 如果验证成功则返回 true,继续执行数据操作业务;否则就返回 false,后续操作数据的业务就不会被执行了 。
  • void postHandle(HttpServletRequest request,HttpServletResponse response ,  Object handle , ModelAndView modelAndView):调用请求方法之后执行,但它会在 DispatcherServlet 进行渲染视图之前被执行 。
  • void afterCompletion(HttpServletRequest request,HttpServletResponse response ,  Object handle ,  Exception ex):会在整个请求结束之后再执行,也就是在 DispatcherServlet 渲染了对应的视图之后再执行 。
配置拦截规则然后,我们再将上面的拦截器注入到项目配置文件中,并设置相应拦截规则,具体实现代码如下:
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;@Configurationpublic class AppConfig implements WebMvcConfigurer {// 注入拦截器@Autowiredprivate TestInterceptor testInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(testInterceptor) // 添加拦截器.addPathPatterns("/**"); // 拦截所有地址.excludePathPatterns("/login"); // 放行接口}}这样我们的拦截器就实现完了 。
(2)拦截器实现原理Spring Boot 拦截器是基于 Java 的 Servlet 规范实现的,通过实现 HandlerInterceptor 接口来实现拦截器功能 。
在 Spring Boot 框架的执行流程中,拦截器被注册在 DispatcherServlet 的 doDispatch() 方法中,该方法是 Spring Boot 框架的核心方法,用于处理请求和响应 。
程序每次执行时都会调用 doDispatch() 方法时 , 并验证拦截器(链),之后再根据拦截器返回的结果,进行下一步的处理 。如果返回的是 true,那么继续调用目标方法,反之则会直接返回验证失败给前端 。


推荐阅读