5-21 拦截器 Interceptor
Spring MVC拦截器
什么是拦截器
拦截器是SpringMvc框架提供的功能
它可以在控制器方法运行之前或运行之后(还有其它特殊时机)对请求进行处理或加工的特定接口
常见面试题:过滤器和拦截器的区别
过滤器和拦截器都可以在控制器方法运行前后加入额外代码,实现aop效果
提供者不同
- 过滤器是由javaEE提供的
- 拦截器是SpringMvc提供的
作用目标不同
- 过滤器作用目标更广:可以作用在所有请求当前服务器资源的流程中
- 拦截器作用目标单一:只能作用在请求目标为当前服务器控制器的流程中

功能强度不同
- 过滤器是原生的JavaEE的功能,功能较弱,不能直接处理Spring容器中的内容和对象
- 拦截器是SpringMvc框架提供的,所以天生和Spring容器有更好的兼容性,可以直接操作Spring容器中的对象,而且拦截器相比于过滤器有更完善的参数返回值的处理,也有更多的运行时机
结论
如果请求的目标能确定是一个控制器方法,优先使用拦截器
如果请求的目标可能是其他静态资源,那么就需要使用过滤器
详细操作,见成老师笔记
Mybatis 拦截器
简介:
Mybatis框架提供的一个功能
能够在Mapper接口方法运行之前或之后添加额外代码的功能
之前我们通过设置,实现将运行的sql语句输出到控制台的效果,就是拦截器实现的
我们也可以简单的进行一个类似的演示
首先,要想能够成功的拦截Mybatis中mapper运行的sql语句
需要先在Spring中设置相关的代码
步骤1:编写拦截器
// Mybatis拦截器测试类
@Slf4j
// Mybatis拦截器配置声明用的注解
// 可以配置拦截多个jdbc中的对象
@Intercepts({@Signature(
type = StatementHandler.class,
method = "prepare",
args = {Connection.class,Integer.class}
)})
public class MyInterceptor implements Interceptor {
// Mybatis拦截器方法
// invocation 就是要运行的目标(这里就是sql语句)
@Override
public Object intercept(Invocation invocation) throws Throwable {
log.info("进入拦截器,准备拦截sql语句");
// 从参数invocation中获得要运行的sql语句对象BoundSql
BoundSql boundSql=((StatementHandler)invocation.getTarget())
.getBoundSql();
// 从boundSql中获取sql语句
String sql=boundSql.getSql();
log.info("要运行的原sql语句为:{}",sql);
// 下面可以将sql语句进行更改
sql=sql+" and 1=1";
log.info("变更后的sql语句:{}",sql);
// 利用反射强制赋值,将boundSql中的sql属性变化
reflectUpdateSql(boundSql,"sql",sql);
return invocation.proceed();
}
// 需要定义个方法,能够将sql语句进行改写
// 但是sql语句已经在invocation我么需要利用反射,将其中的属性改写
private void reflectUpdateSql(BoundSql boundSql,
String attrName,String attrValue)
throws NoSuchFieldException, IllegalAccessException {
// 这个方法目标是将boundSql对象的sql强制赋值赋值
// 反射的属性类
Field field=boundSql.getClass().getDeclaredField(attrName);
// 设置属性可强制赋值 设置之后就不是私有属性了
field.setAccessible(true);
// 将准备好的值赋值到这个属性中
field.set(boundSql,attrValue);
}
// User 类 User类中有个私有属性password 没有getset方法
// 反射是可以强制给password属性赋值的
// BoundSql相当于User对象
// attrName相当于password属性
// attrValue相当于我们要强制付给属性的值
}
步骤2:
将拦截器设置在SpringBoot框架下使其生效
config包中
//这个类是配置Mybatis拦截器生效的配置类
@Configuration
// 配置Mybatis拦截器生效的固定代码
@AutoConfigureAfter(MybatisAutoConfiguration.class)
public class InterceptorConfig {
// 获得Mybatis的会话管理器
// Mybatis会话管理器就是执行连接操作数据库的核心类
@Autowired
private List<SqlSessionFactory> sqlSessionFactoryList;
// 下面方法是将Mybatis会话管理器中所有连接和我们编写的拦截器关联,使拦截器生效
@PostConstruct
public void addInterceptors(){
// 实例化我们编写的拦截器
Interceptor interceptor=new MyInterceptor();
for (SqlSessionFactory factory:sqlSessionFactoryList){
factory.getConfiguration().addInterceptor(interceptor);
}
}
}
5-21 拦截器 Interceptor的更多相关文章
- struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo
理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...
- struts2拦截器interceptor的三种配置方法
1.struts2拦截器interceptor的三种配置方法 方法1. 普通配置法 <struts> <package name="struts2" extend ...
- SSM-SpringMVC-33:SpringMVC中拦截器Interceptor讲解
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 拦截器Interceptor: 对处理方法进行双向的拦截,可以对其做日志记录等 我选择的是实现Handler ...
- 过滤器(Filter)和拦截器(Interceptor)
过滤器(Filter) Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序.它依赖于servlet容器,在实现上,基于函数回调,它可以对几乎所有请求 ...
- 二十五、过滤器Filter,监听器Listener,拦截器Interceptor的区别
1.Servlet:运行在服务器上可以动态生成web页面.servlet的声明周期从被装入到web服务器内存,到服务器关闭结束.一般启动web服务器时会加载servelt的实例进行装入,然后初始化工作 ...
- Flume 拦截器(interceptor)详解
flume 拦截器(interceptor)1.flume拦截器介绍拦截器是简单的插件式组件,设置在source和channel之间.source接收到的事件event,在写入channel之前,拦截 ...
- struts2拦截器interceptor的配置方法及使用
转: struts2拦截器interceptor的配置方法及使用 (2015-11-09 10:22:28) 转载▼ 标签: it 365 分类: Struts2 NormalText Code ...
- Kafka producer拦截器(interceptor)
Producer拦截器(interceptor)是个相当新的功能,它和consumer端interceptor是在Kafka 0.10版本被引入的,主要用于实现clients端的定制化控制逻辑. 对于 ...
- Flume-NG源码阅读之SourceRunner,及选择器selector和拦截器interceptor的执行
在AbstractConfigurationProvider类中loadSources方法会将所有的source进行封装成SourceRunner放到了Map<String, SourceRun ...
- JavaWeb—拦截器Interceptor
1.概念 java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取A ...
随机推荐
- Bootstrap Blazor Table 组件(三)智能生成
原文链接:https://www.cnblogs.com/ysmc/p/16201153.html Bootstrap Blazor 官网地址:https://www.blazor.zone 有了解过 ...
- react-router@6 版本初体验
最近使用了一下react-router@6 版本感觉有很大的改动,记录一下. React Router v6 makes heavy use of React hooks, so you'll nee ...
- Linux-进程工具
1.进程树 pstree pstree 可以用来显示进程的父子关系,以树形结构显示 格式: pstree [OPTION] [ PID | USER ] 常用选项: -p 显示PID -T 不显示线程 ...
- 小白必看:零基础安装Linux系统(超级详细)
我们以最新发布的CentOS 8.1为例,学习下如何安装Linux系统 准备工作: 1.一台可以访问互联网的电脑 2.VMware Workstation安装包 3.CentOS8.1镜像(CentO ...
- 机器学习实战-k近邻算法
写在开头,打算耐心啃完机器学习实战这本书,所用版本为2013年6月第1版 在P19页的实施kNN算法时,有很多地方不懂,遂仔细研究,记录如下: 字典按值进行排序 首先仔细读完kNN算法之后,了解其是用 ...
- PCIe引脚PRSNT与热插拔
热插拔的基本目的是要让PCIe设备按照规定的顺序.原则,从系统中移除或插入到系统中来,并能正常的工作,且不影响系统的正常运行.事实上,PCIe"热插拔"的关键目的就是为前面面所提到 ...
- Grafana+Prometheus 搭建 JuiceFS 可视化监控系统
作为承载海量数据存储的分布式文件系统,用户通常需要直观地了解整个系统的容量.文件数量.CPU 负载.磁盘 IO.缓存等指标的变化. JuiceFS 没有重复造轮子,而是通过 Prometheus 兼容 ...
- CF1682C. LIS or Reverse LIS?
题意:给\(n\)个数,问你能构出严格上升子序列长度和下降子序列长度最小值的最大值. 思路: 如果一个数出现至少两次,ans++. 统计出现一次的个数,因为再最长上升子序列中,只能有一个值能贡献到下降 ...
- 「Java分享客栈」Nacos配置中心称王称霸,我Apollo一生也不弱于人!
前言 Apollo又称阿波罗配置中心,在前两年还是挺火的,但阿里SpringCloud套件席卷国内之后,nacos就成为了最被亲睐的分布式配置中心,nacos是配置中心和注册中心二合一的产品,单纯功能 ...
- 2021.03.20【NOIP提高B组】模拟 总结
区间 DP 专场:愉快爆炸 T1 题目大意 有 \(n\) 个有颜色的块,连续 \(k\) 个相同颜色的就可以消掉 现在可以在任意位置插入任意颜色的方块,问最少插入多少个可以全部抵消 题解 先把连续的 ...