SpringBoot项目整合拦截器详解
作者:浪浪山的猿
什么是拦截器
java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。
在AOP中,拦截器用于在某个方法或者字段被访问之前进行拦截,然后再之前或者之后加入某些操作。
拦截器的应用场景
- 日志记录:可以记录请求信息的日志,以便进行信息监控、信息统计等。
- 权限检查:如登陆检测,进入处理器检测是否登陆,如果没有直接返回到登陆页面。
- 性能监控:典型的是慢日志。
拦截器的使用
自定义拦截器的步骤:
- 自定义拦截器类并实现HandlerInterceptor接口
/** * @author gf * @date 2023/2/6 */ @Component public class Intercepter1 implements HandlerInterceptor { @Override //在将请求发送到控制器controller之前执行操作,若返回true就进入控制器,若返回false就不进入控制器了 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("token"); System.out.println("自定义拦截器1-----拦截到的token值为:"+token); return null != token; } @Override //用于在将响应发送到客户端之前执行操作,就是控制器执行完之后返回数据时执行。 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { System.out.println("自定义拦截器1-----控制器执行完毕,返回数据"); } @Override //在完成请求和响应后执行操作 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { System.out.println("自定义拦截器1-----响应结束"); } }
自定义拦截器类,通过实现HandlerInterceptor接口并重写他的三个方法,preHandle、postHandle、afterCompletion,实现拦截控制。
- preHandle:在将请求发送到控制器controller之前执行操作,若返回true就进入控制器,若返回false就不进入控制器了。
- postHandle:用于在将响应发送到客户端之前执行操作,就是控制器执行完之后返回数据时执行。
- afterCompletion:在完成请求和响应后执行操作。
注册自定义拦截器
拦截器的注册是通过重写WebMvcConfigurer接口的addInterceptors方法实现的,老版本的WebMvcConfigurerAdapter使用时发现已经被淘汰了,不推荐使用了。
/** * @author gf * @date 2023/2/6 */ @Configuration public class InterceptConfig implements WebMvcConfigurer { //引入自定义拦截器对象 @Resource private Intercepter1 Intercepter1; //重写addInterceptors方法注册拦截器 @Override public void addInterceptors(InterceptorRegistry registry) { //addPathPatterns方法添加拦截路径匹配规则("/**"是拦截所有),excludePathPatterns方法是设置白名单,放行哪些路 registry.addInterceptor(Intercepter1).addPathPatterns("/**").excludePathPatterns("/test/*").order(1); } }
测试效果
编写测试类
@GetMapping("/test") public BaseResponse<String> sayHello(@RequestParam("name") String name){ if(!name.equals("老王")){ throw new BaseException(BaseErrorEnum.USER_NOT_EXIST); } else{ return RespGenerator.success("调用成功"); } }
测试先不传token
可以看到不传token时,preHandle方法返回false,不在执行后面的方法
测试传token
可以看到传递token后,拦截器放行,执行了后面的方法,
拦截器的优先级
我们重新再增加两个拦截器
设置Order的值
请求接口,查看拦截器的执行顺序
对于order的顺序:拦截器的preHandle方法是根据order的大小从小到大顺序执行,postHandle和afterCompletion方法是根据order的大小从小到大倒叙执行。
拦截器和过滤器的区别
拦截器是spring在基于反射机制实现的,过滤器是基于servlet的回调实现的;
拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑
深度不同:过滤器只在Servlet前后起作用,而拦截器可以深入到方法前后,异常抛出前后等,相比较过滤器具有更大的弹性。
到此这篇关于SpringBoot项目整合拦截器详解的文章就介绍到这了,更多相关SpringBoot整合拦截器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!