文章插图
在 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,那么继续调用目标方法,反之则会直接返回验证失败给前端 。
推荐阅读
- 机器学习如何帮助企业应对网络威胁?
- 热水器只有冷水没热水怎么办
- 低碳产品包括 低碳产品包括A越野车B新能源汽车C白炽灯D太阳能热水器
- 笔记本电源怎么拆开 电源适配器拆开方法图解
- 热水器一冷一热怎么解决 热水器一冷一热怎么解决视频
- 万和热水器使用方法 万和热水器使用方法视频万和燃气热水器怎么使用
- 男生的生殖长一般多大 男人的生殖器多长多大才标准
- 男生器官上长了痘痘是因为什么 男生器官上长痘痘的原因
- 路由器放在冰箱上是否影响网速 路由器可以放在冰箱上吗
- 扩音器录音使用方法图解 扩音器录音使用方法