1、视频参加Spring Security开发安全的REST服务PART1PART1 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的执行顺利