springMvc接口开发--对访问的restful api接口进行拦截实现功能扩展
1、视频参加Spring Security开发安全的REST服务\PART1\PART1 3-7 使用切片拦截REST服务三通it学院-www.santongit.com-.mp4
讲的比较的经典,后面我也会通过案例来对代码进行分析
restful api的拦截主要有下面的三个部分,我们一一对这个三个部分进行讲解
1.第一时间filter过滤器要记录处理每个请求服务的时间
在springboot中没有web.xml配置文件,那如何把一个filter添加到springboot中了
我们编写一个配置类,注册一个FilterRegisterrationBean,把我们的filter注册进去,指定我们filter过来的url
启动成功之后,日志信息为
filter最大的问题参数中只能得到request对象,reponse对象,获得其中的参数
如果要获得当前的restful api是那个springmvc的control和方法做处理,filter是无法完成的
我们可以使用springmvc框架的拦截器来实现这个功能
springmvc的拦截器需要实现HandlerInterceptor接口
有三个方法
preHandle postHandler afterCompletion
prehandle在实际调用的control中的方法被执行之前,会先执行preHandle,prehandler方法的返回值必须是true,后续的control中实际调用的方法和postHandler方法才能执行,这里需要特别注意下
control中的方法被执行完成之后会调用postHandle方法,如果control中的方法被执行过程中出现了异常就不会执行postHandler方法
afterCompletion不管ontrol中的方法被执行过程中是否出现了异常,都会被调用
try{
preHandle()
control中的方法被执行()
postHandler ()
}catch(Exception e){
}finally{
afterCompletion()
}
上面中参数handler可以得到当前restapi要访问的那个control以及对于control对应的方法
接下来我们要把拦截器添加到springboot中如何实现了
第一步:我们自定义的拦截器使用@compent添加到spring 容器中
其中自定义一个配置类,该类需要继承webMvcConfigurerAdapter,然后将我们自定义的拦截器注册到interceptorRegistry中,就满足条件了
接下来我们来看下日志的打印
通过拦截器:首先我们可以通过拦截器的Object handler参数知道当前api 访问那个control类已经方法,拦截器和过滤器一样可以设置拦截那些url的请求
/** |
上面
addPathPatterns就是制定拦截器拦截的url 使用拦截器可以得到request对象,response对象以及Object handler对象,handler对象可以得到当前调用方法的方法名
使用拦截器我们可以得到getInfo这个调用方法的名字,但是在拦截器的preHandle方法中我们是无法得到getInfo方法中传入的参数id,要得到传入参数的id。我们必须使用aop,这也是我们讲解的重点
springboot使用aop需要加入aop的依赖
接下来我们写一个切片
定义了一个aspect切片类,采用@Around环绕方式
在参数ProceedingJoinPoint中我们可以得到执行方法的参数
我们来看下日志的打印
过滤器 拦截器 aspect的执行顺序如下
先执行过滤器,所以先打印了time filter start,再执行拦截器,所以打印了prehandle 接下来执行aspect切面打印 time aspect start
接下来才真正执行method的方法,打印进入getInfo服务,方法执行完成之后,一层一层的向上回去,回去首先执行acpect 打印 time aspectend,
然后回退到拦截器,首先执行拦截器的postHandler方法,再执行afterHandler方法,最后在执行过滤器的退出方法,打印timefilterend 不清楚的看上面的图,一定要了解,过滤器 拦截器 以及aspect的执行顺利
最新文章
- 基于RN开发的一款视频配音APP(开源)
- Struts和SpringMVC两种MVC框架比较
- Java泛型01--任意数组中两元素交换
- hbuilder的aptana php插件无法提示命名空间之外函数和对象的解决办法
- rman进行备份、恢复
- 第八届河南省赛G.Interference Signal(dp)
- P1156 垃圾陷阱
- 1_类的定义(Defining Class)
- MySQL 如何使用 PV 和 PVC?- 每天5分钟玩转 Docker 容器技术(154)
- C#获取当前日期时间
- 进程有一个全局变量i,还有有两个线程。i++在两个线程里边分别执行100次,能得到的最大值和最小值分别是多少?
- The processing instruction target matching &;quot;[xX][mM][lL]&;quot; is not allowed.
- 数组copy
- Vue.js常用指令:v-bind
- strerror函数的总结【转】
- LOJ.2863.[IOI2018]组合动作(交互)
- MySQL主从.md
- 分布式缓存技术memcached学习系列(二)——memcached基础命令
- 【Android】5.3 单选和复选
- Ubuntu 16.04安装Eclipse并创建桌面快捷方式