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 ...
随机推荐
- 2022年最新Cloudflare免费自选IP教程(非Partner)
写在开头 众所周知,CF在去年底大规模禁用Host API key,使得Partner自选法失效.但最近,Cloudflare为所有计划添加了100个SaaS域免费额度(以前$2一个). 经过一番摸索 ...
- 解析Java-throw抛出异常详细过程
摘要:Java有3种抛出异常的形式:throw.throws.系统自动抛异常. 本文分享自华为云社区<Java-throw异常详解以及过程>,作者: gentle_zhou . 首先,我们 ...
- 高级IPC DBus
What is IPC IPC [Inter-Process Communication] 进程间通信,指至少两个进程或线程间传送数据或信号的一些技术或方法.在Linux/Unix中,提供了许多IPC ...
- 用简单的 Node.js 后台程序浅析 HTTP 请求与响应
用简单的 Node.js 后台程序浅析 HTTP 请求与响应 本文写于 2020 年 1 月 18 日 我们来看两种方式发送 HTTP 请求,一种呢,是命令行的 curl 命令:一种呢是直接在浏览器的 ...
- Arthas常用功能及一次线上问题排查
一.Arthas简介 Arthas是Alibaba开源的Java诊断工具,功能很强大,它是通过Agent方式来连接运行的Java进程.主要通过交互式来完成功能. https://arthas.aliy ...
- typora的下载和基本的使用
目录 typora的下载和基本的使用 typora的下载 typora基本的使用 选择自己喜爱的主题 创建标题 进入编程环境 改变文本样式 插入链接 插入图片 有序列表 无序列表 创建表格 单选框 表 ...
- C++从静态类型到单例模式
目录 1. 概述 2. 详论 2.1. 静态类型 2.1.1. 静态方法成员 2.1.2. 静态数据成员 2.2. 单例模式 2.2.1. 实现 2.2.2. 问题 3. 参考 1. 概述 很多的知识 ...
- CenterNet和CenterNet2笔记
CenterNet和CenterNet2笔记 CenterNet是基于anchor-free的一阶段检测算法 CenterNet2是CenterNet作者基于两阶段的改进 CenterNet(Obje ...
- Python模块Ⅰ
Python模块Ⅰ part1 模块的定义/取别名 自定义模块 什么是模块:模块的本质就是.py文件,封装语句的最小单位 模块中出现的变量,for循环,if结构,函数定义...称为模块成员 模块的运行 ...
- Java虚拟机启动过程解析
一.序言 当我们在编写Java应用的时候,很少会注意Java程序是如何被运行的,如何被操作系统管理和调度的.带着好奇心,探索一下Java虚拟机启动过程. 1.素材准备 从Java源代码.Java字节码 ...