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. Django/SQL server 配置实现(附下载安装)

    连接方案1: conn = pymssql.connect(host='127.0.0.1', port=1433, user='sa', password='password', database= ...

  2. GO语言学习——切片三 append()方法为切片添加元素、切片的扩容策略、使用copy()函数复制切片、从切片中删除元素

    append()方法为切片添加元素 注意:通过var声明的零值切片可以在append()函数直接使用,无需初始化. var s []int s = append(s, 1, 2, 3) append( ...

  3. muduo源码分析之Buffer

    这一次我们来分析下muduo中Buffer的作用,我们知道,当我们客户端向服务器发送数据时候,服务器就会读取我们发送的数据,然后进行一系列处理,然后再发送到其他地方,在这里我们想象一下最简单的Echo ...

  4. k8s入门之Secret(十)

    Secret与ConfigMap都是用来存储配置信息的,不同之处在于ConfigMap是明文存储的,而Secret用来保存敏感信息,如:密码.OAuth令牌,ssh key等等.Secret常用有三种 ...

  5. linux项目部署(非前后端分离crm)

    参考博客 参考博客2---部署过程 导论:看参考博客1 WSGI是Web服务器网关接口.它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收 ...

  6. Python 散列表查询_进入<哈希函数>为结界的世界

    1. 前言 哈希表或称为散列表,是一种常见的.使用频率非常高的数据存储方案. 哈希表属于抽象数据结构,需要开发者按哈希表数据结构的存储要求进行 API 定制,对于大部分高级语言而言,都会提供已经实现好 ...

  7. Spring Cloud Feign+Hystrix自定义异常处理

    开启Hystrix spring-cloud-dependencies Dalston版本之后,默认Feign对Hystrix的支持默认是关闭的,需要手动开启. feign.hystrix.enabl ...

  8. MySQL闪回工具之binlog2sql

    一.binlog2sql 1.1 安装binlog2sql git clone https://github.com/danfengcao/binlog2sql.git && cd b ...

  9. VMWare中CentOS安装VM-Tools

    查看CD-ROM驱动器的设备信息 可以通过下面几个命令来查看 dmesg命令 dmesg | egrep -i --color 'cdrom|dvd|cd/rw|writer' /proc/sys/d ...

  10. linux篇-linux下zabbix安装

    1本人用的是apache+mysql+php 2下载zabbix软件包,官网下载 https://sourceforge.net/projects/zabbix/files/ZABBIX Latest ...