SpringBoot之Interceptor拦截器注入使用
相关文章:
SpringBoot 之AOP切面的使用
SpringBoot之Listener注册到Spring容器中的多种方法
SpringBoot之Filter过滤器的实现及排序问题
SpringBoot 之多个过滤器(Filter) ,监听器(Listener),切面(AOP),拦截器(Interceptor)的指定排序问题总结篇
springboot中实现拦截器方式
实现方式
实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter 抽象类
两者区别
HandlerInterceptorAdapter 实现AsyncHandlerInterceptor接口,AsyncHandlerInterceptor接口 继承HandlerInterceptor接口。AsyncHandlerInterceptor接口多了一个afterConcurrentHandlingStarted方法
创建一个拦截器实现HandlerInterceptor接口
在jdk1.8之后,只需要实现自己需要的方法。因为接口有默认实现。
@Component
public class LoginInterceptor implements HandlerInterceptor {/*** 预处理回调方法,实现处理器的预处理* 返回值:true表示继续流程;false表示流程中断,不会继续调用其他的拦截器或处理器*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("方法开始前拦截.........");//业务代码 返回false或者truereturn false;}/*** 后处理回调方法,实现处理器(controller)的后处理,但在渲染视图之前* 此时我们可以通过modelAndView对模型数据进行处理或对视图进行处理*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println("方法返回后拦截.........");}/*** 整个请求处理完毕回调方法,即在视图渲染完毕时回调,* 如性能监控中我们可以在此记录结束时间并输出消耗时间,* 还可以进行一些资源清理,类似于try-catch-finally中的finally,* 但仅调用处理器执行链中*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {System.out.println("方法结束后拦截.........");}
}
创建一个拦截器继承HandlerInterceptorAdapter类
@Component
public class LoginInterceptor implements HandlerInterceptor {/*** 预处理回调方法,实现处理器的预处理* 返回值:true表示继续流程;false表示流程中断,不会继续调用其他的拦截器或处理器*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("方法开始前拦截.........");//业务代码 返回false或者truereturn false;}/*** 后处理回调方法,实现处理器(controller)的后处理,但在渲染视图之前* 此时我们可以通过modelAndView对模型数据进行处理或对视图进行处理*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println("方法返回后拦截.........");}/*** 整个请求处理完毕回调方法,即在视图渲染完毕时回调,* 如性能监控中我们可以在此记录结束时间并输出消耗时间,* 还可以进行一些资源清理,类似于try-catch-finally中的finally,* 但仅调用处理器执行链中*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {System.out.println("方法结束后拦截.........");}/*** 如果返回一个current类型的变量,会启用一个新的线程。执行完preHandle方法之后立即会调用afterConcurrentHandlingStarted,然后新线程再以次执行*/@Overridepublic void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("do something.........");super.afterConcurrentHandlingStarted(request, response, handler);}
}
创建配置类来管理拦截器,并将之前的拦截器注入其中
两种方式,实现 WebMvcConfigurer 或者继承 WebMvcConfigurationSupport 两者没什么区别,看项目的选择。
@Configuration
public class MvcInterceptorConfig extends WebMvcConfigurationSupport {@Autowiredprivate LoginInterceptor loginInterceptor;@Overrideprotected void addInterceptors(InterceptorRegistry registry) {// 多个拦截器组成一个拦截器链// addPathPatterns 用于添加拦截规则,/**表示拦截所有请求// excludePathPatterns 用户排除拦截registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/stuInfo/getAllStuInfoA","/account/register"); }
}
多个拦截器执行顺序
多个拦截器的执行顺序按照你的代码代码添加顺序,先添加后执行。
在未设置order方法值时:
registry.addInterceptor(repeatPutInterceptor) // 1
registry.addInterceptor(refererInterceptor) // 2
registry.addInterceptor(loginAuthInterceptor) //3
针对于preHandle 执行顺序为:1->2->3
针对于postHandle执行顺序为:3->2->1
针对于afterCompletion执行顺序为:3->2->1
设置order值时:此时能实现自定义顺序
registry.addInterceptor(repeatPutInterceptor).order(1) // 1
registry.addInterceptor(loginAuthInterceptor).order(3) //2
registry.addInterceptor(refererInterceptor).order(2) // 3
针对于preHandle 执行顺序为:1->3->2
针对于postHandle执行顺序为:2->3->1
针对于afterCompletion执行顺序为:2->3->1
源码出处:InterceptorRegistry类
protected List<Object> getInterceptors() {return this.registrations.stream().sorted(INTERCEPTOR_ORDER_COMPARATOR).map(InterceptorRegistration::getInterceptor).collect(Collectors.toList());
}
private static final Comparator<Object> INTERCEPTOR_ORDER_COMPARATOR =OrderComparator.INSTANCE.withSourceProvider(object -> {if (object instanceof InterceptorRegistration) {return (Ordered) ((InterceptorRegistration) object)::getOrder;}return null;});
排序问题
添加@order注解,和实现Ordered 接口都无法实现自定义顺序的。只能在配置类中注入拦截器的时候添加order或者使用代码顺序来自定义排序
SpringBoot之Interceptor拦截器注入使用相关推荐
- 【SpringBoot】解决拦截器注入 Service 为空问题
一.自定义拦截器实现 HandlerInterceptor 接口 /*** * Created by zhh on 2018/04/20.*/ public class MyInterceptor i ...
- 【Java代码】使用 org.apache.ibatis.plugin.Interceptor 拦截器实现全局 mapper.xml 参数注入(可用于切换数据库实例schema+Demo举例源码)
1. why 项目没有使用MyBatis,进行数据操作时使用的是jdbc中默认的schema,现在项目要加入多租户,同一个数据库下不同租户使用不同的实例schema,这就要在mapper文件内所有 ...
- springboot Interceptor拦截器excludePathPatterns失效
springboot Interceptor拦截器excludePathPatterns失效 使用jwt和HandlerInterceptorAdapter做登录的拦截放行失效,其实更多时候不是配置文 ...
- springboot 自定义注解拦截器
springboot 自定义注解拦截器 最近在工作中,发现自定义注解拦截使用起来特别方便,现在来写出来给大家看看 环境springboot 首先写一个自定义注解 package com.study.c ...
- SpringBoot中配置拦截器时,跨域失效
SpringBoot中配置拦截器时,跨域失效 前后段分离的项目,配置了跨域后,访问正常,但是配置了拦截器以后,有的访问正常,有的出现跨域问题,发现出现跨域问题的都是拦截器里面没有放行的请求. @Con ...
- springMVC之Interceptor拦截器
转自:https://blog.csdn.net/qq_25673113/article/details/79153547 Interceptor拦截器用于拦截Controller层接口,表现形式有点 ...
- interceptor拦截器典型应用实例----数据稽核
interceptor拦截器典型应用实例----数据稽核 Interceptor拦截器的使用小结,程序实例是典型的 "数据稽核"过程,即在对数据库中的数据进行修改后会自动添加对应的 ...
- 框架:SpringMVC中Interceptor拦截器的两种实现
Spring中使用Interceptor拦截器 SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证, ...
- spring拦截器覆盖_Spring中使用Interceptor拦截器
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...
最新文章
- Go if _,ok:=range map; ok判断key是否在map中
- 赢在CSDN —— 我们一起向前
- 机器学习之凸优化原理推导及相关知识总结
- php容器概念,深入thinkphp5.1之Container容器
- (转)使用C#开发ActiveX控件
- 机器学习5-支持向量机
- VS2018 查看类图 安装-属性,快捷键
- AN APPROACH OF VECTOR FIELD TEXTURE VISUALIZATION BASED ON FIELD DRIVEN STRENGTH算法实现
- jcp jsr_JCP EC 2011年特别选举结果即将公布!
- 80x86系统微处理器简介
- canvas实现矩形框,用来进行图片框选
- office2021下载|office2021安装包配置过程图文教程
- matlab坐标值旋转平移
- Silverlight教程第五部分:用 ListBox 和 DataBinding 显示列表数据 (木野狐译)
- 阴阳师双拉条怎么不被超车
- 中科院博士论文致谢部分走红,感动无数网友,其实沉下心来,你我何尝不是前程万里
- Windows Server 2016-Nano Server介绍
- vsCode 打开界面报错,尝试在目标目录创建文件时发生一个错误
- cad在线转低版本_CAD这些技巧你还不会怎么当大神
- win10操作系统如何进行局域网文件共享
热门文章
- python如何识别中文_python如何识别图片中的文字
- android真实项目教程(一)——App应用框架搭建_by_CJJ
- 26期20180615磁盘格式化挂载以及手动增加swap空间
- Mysql Grant 用户权限总结(详细编)
- 全球以太网交换机和路由器市场:谁领跑?
- Android基础知识点的整理3
- Spark成为大数据高手进阶步骤
- 利用Civil 3D API更改曲面的样式
- Kubernetes 的CRI-O容器引擎中存在严重漏洞
- 他们从各大操作系统中发现了26个 USB 漏洞,用的是这款模糊测试工具