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的更多相关文章

  1. struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo

    理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...

  2. struts2拦截器interceptor的三种配置方法

    1.struts2拦截器interceptor的三种配置方法 方法1. 普通配置法 <struts> <package name="struts2" extend ...

  3. SSM-SpringMVC-33:SpringMVC中拦截器Interceptor讲解

     ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 拦截器Interceptor: 对处理方法进行双向的拦截,可以对其做日志记录等 我选择的是实现Handler ...

  4. 过滤器(Filter)和拦截器(Interceptor)

    过滤器(Filter) Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序.它依赖于servlet容器,在实现上,基于函数回调,它可以对几乎所有请求 ...

  5. 二十五、过滤器Filter,监听器Listener,拦截器Interceptor的区别

    1.Servlet:运行在服务器上可以动态生成web页面.servlet的声明周期从被装入到web服务器内存,到服务器关闭结束.一般启动web服务器时会加载servelt的实例进行装入,然后初始化工作 ...

  6. Flume 拦截器(interceptor)详解

    flume 拦截器(interceptor)1.flume拦截器介绍拦截器是简单的插件式组件,设置在source和channel之间.source接收到的事件event,在写入channel之前,拦截 ...

  7. struts2拦截器interceptor的配置方法及使用

    转: struts2拦截器interceptor的配置方法及使用 (2015-11-09 10:22:28) 转载▼ 标签: it 365 分类: Struts2  NormalText Code  ...

  8. Kafka producer拦截器(interceptor)

    Producer拦截器(interceptor)是个相当新的功能,它和consumer端interceptor是在Kafka 0.10版本被引入的,主要用于实现clients端的定制化控制逻辑. 对于 ...

  9. Flume-NG源码阅读之SourceRunner,及选择器selector和拦截器interceptor的执行

    在AbstractConfigurationProvider类中loadSources方法会将所有的source进行封装成SourceRunner放到了Map<String, SourceRun ...

  10. JavaWeb—拦截器Interceptor

    1.概念 java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取A ...

随机推荐

  1. Linux Centos7 根分区磁盘扩容[详解]

    CentOS7 根分区扩容 [详细过程] 前提 1.如果原来的系统根分区为逻辑卷分区 则可以使用如下的方法 如果不是则不可以 2.如果原来的系统根分区不是逻辑卷分区 则不可以扩展只能再添加挂在磁盘进行 ...

  2. Golang 实现 Redis(10): 本地原子性事务

    为了支持多个命令的原子性执行 Redis 提供了事务机制. Redis 官方文档中称事务带有以下两个重要的保证: 事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中 ...

  3. SpringBoot从0到0.7——第一天

    SpringBoot从0到0.7--第一天 学习的第一步当然是收拾好心情,先把环境搭建起来,写出第一个helloword出来. 第一步:安装IDEA和Tomcat 我安装的是IDEA 2021.2.2 ...

  4. Spring 源码(10)Spring Bean 的创建过程(1)

    Spring Bean的创建刚开始进行了一些准备工作,比如转换服务的初始化,占位符解析器的初始化,BeanDefinition元数据的冻结等操作,都是为了在创建Bean的过程中保证Bean的正确的创建 ...

  5. logging日志模块详细,日志模块的配置字典,第三方模块的下载与使用

    logging日志模块详细 简介 用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么 了,但是当我需要看大量的地方或者在一个文件中查看的时 ...

  6. 电机噪声之谐波分析(内附simulink中FFT分析的相关参数配置与解析)

    电机噪声之谐波分析(内附simulink中FFT分析的相关参数配置与解析) 目录 电机噪声之谐波分析(内附simulink中FFT分析的相关参数配置与解析) 写在前面 正文 电机噪声 谐波的产生 什么 ...

  7. 零基础学Java第三节(基本输入输出)

    本篇文章是<零基础学Java>专栏的第三篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 本文章首发于公众号[编程攻略] Java程序的命令行参数 我们可以 ...

  8. 渗透:wesside-ng

    WEP自动破解工具wesside-ng wesside-ng是aircrack-ng套件提供的一个概念验证工具.该工具可以自动扫描无线网络,发现WEP加密的AP.然后,尝试关联该AP.关联成功后,它会 ...

  9. 基于.NetCore开发博客项目 StarBlog - (7) 页面开发之文章详情页面

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  10. 大数据分析——sklearn模块安装

    前提条件:numpy.scipy以及matplotlib库的安装 (注:所有操作都在pycharm命令终端进行) ①numpy安装 pip install numpy ②scipy安装 pip ins ...