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的请求

   /**
* 配置拦截器
* @author lance
* @param registry
*/
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new UserSecurityInterceptor()).addPathPatterns("/user/**");
}

上面

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的执行顺利

												

最新文章

  1. 基于RN开发的一款视频配音APP(开源)
  2. Struts和SpringMVC两种MVC框架比较
  3. Java泛型01--任意数组中两元素交换
  4. hbuilder的aptana php插件无法提示命名空间之外函数和对象的解决办法
  5. rman进行备份、恢复
  6. 第八届河南省赛G.Interference Signal(dp)
  7. P1156 垃圾陷阱
  8. 1_类的定义(Defining Class)
  9. MySQL 如何使用 PV 和 PVC?- 每天5分钟玩转 Docker 容器技术(154)
  10. C#获取当前日期时间
  11. 进程有一个全局变量i,还有有两个线程。i++在两个线程里边分别执行100次,能得到的最大值和最小值分别是多少?
  12. The processing instruction target matching "[xX][mM][lL]" is not allowed.
  13. 数组copy
  14. Vue.js常用指令:v-bind
  15. strerror函数的总结【转】
  16. LOJ.2863.[IOI2018]组合动作(交互)
  17. MySQL主从.md
  18. 分布式缓存技术memcached学习系列(二)——memcached基础命令
  19. 【Android】5.3 单选和复选
  20. Ubuntu 16.04安装Eclipse并创建桌面快捷方式

热门文章

  1. 看了这篇,我确定你已经彻底搞懂Java的继承了
  2. TechEmpower Web 框架性能第19轮测试结果正式发布,ASP.NET Core在主流框架中拔得头筹
  3. JavaWeb项目:旅游网站【涉及各种知识】
  4. 数据库之 MySQL --- 数据处理 之 子查询 (二)
  5. Java实现 LeetCode 838 推多米诺(暴力模拟)
  6. Java实现 LeetCode 617 合并二叉树(遍历树)
  7. java实现汉诺塔计数
  8. 用vue实现一个简单的时间屏幕
  9. 树莓派学习--安装GPIO Zero
  10. 若linux 的分区硬盘满,如何处理?