• springMvc接口开发--对访问的restful api接口进行拦截实现功能扩展


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



  • 相关阅读:
    idea 配置git
    mybatisgenerator自动生成Mapper.dao.entity
    Eclipse中设置作者日期等Java注释模板
    二分图匹配KM算法
    网络流最小费用最大流
    图论tarjan
    STL的一些基本操作
    图论拓扑排序
    字符串的一些基本操作
    网络流最大流
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/10703419.html
Copyright © 2020-2023  润新知