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 ...
随机推荐
- stm32F103C8T6通过写寄存器点亮LED灯
因为我写寄存器的操作不太熟练,所以最近腾出时间学习了一下怎么写寄存器,现在把我的经验贴出来,如有不足请指正 我使用的板子是stm32F103C8T6(也就是最常用的板子),现在要通过写GPIO的寄存器 ...
- CSS常用技术
1.处理图片底部 5px 间距 <style> body {background: #2d97db;} .imgBox { background: #fff; font-size: 0; ...
- ElasticSearch7.3学习(二十三)----RestHighLevelClient Java api实现match_all、ids、match、term、multi_match、bool、filter、sort等不同的搜索方式
1.数据准备 首先创建book索引 PUT /book/ { "settings": { "number_of_shards": 1, "number ...
- 服务器/网络/虚拟化/云平台自动化运维-ansible
ansible与netconf的对比 首先明确一个概念,netconf是协议,ansible是python编写的工具 netconf 使用YANG建模,XML进行数据填充,使用netconf协议进行传 ...
- @ConfigurationProperties(prefix = "server-options") 抛出 SpringBoot Configuration Annotation Processor not configured 错误
说明 spring-boot-configuration-processor 包的作用是自动生成 META-INF/spring-configuration-metadata.json 文件,而这个 ...
- 面试突击49:说一下 JUC 中的 Exchange 交换器?
Exchange(交换器)顾名思义,它是用来实现两个线程间的数据交换的,它诞生于 JDK 1.5,它有两个核心方法: exchange(V x):等待另一个线程到达此交换点,然后将对象传输给另一个线程 ...
- 从头创建一个新的vue项目------用npm|yarn下载vue-cli|vue-ui创建vue
1.下载node或者是nvm node可以直接去node官网下载,http://nodejs.cn/,默认是长期维护的版本 如果想管理node的版本,可以下载nvm.这个是可选的.但是作为一个前端工程 ...
- Google搜索为什么不能无限分页?
这是一个很有意思却很少有人注意的问题. 当我用Google搜索MySQL这个关键词的时候,Google只提供了13页的搜索结果,我通过修改url的分页参数试图搜索第14页数据,结果出现了以下的错误提示 ...
- STM32内存知识
在了解STM32内存之前需要了解 MCU 的型号和MDK 中的.map 文件,很多刚学习 stm32 时都不会过多的去了解 MCU 的选型,是在太枯燥了.这里在从新了解一下,久了就熟悉了. 一.STM ...
- 【物联网天线选择攻略】2.4GHz 频段增益天线模块设备选择
天线模块设备(antenna)是一种能量变换器,它把传输线上传播的导行波,变换成在无界媒介中传播的电磁波,或者进行相反的变换.对于设计一个应用于射频系统中的小功率.短距离的2.4GHz无线收发设备, ...