SpringBoot系列(十一)拦截器与拦截器链的配置与使用详解,你知道多少?

往期推荐html

SpringBoot系列(一)idea新建Springboot项目java

SpringBoot系列(二)入门知识web

springBoot系列(三)配置文件详解spring

SpringBoot系列(四)web静态资源配置详解后端

SpringBoot系列(五)Mybatis整合完整详细版跨域

SpringBoot系列(六)集成thymeleaf详解版数组

Springboot系列(七) 集成接口文档swagger,使用,测试浏览器

SpringBoot系列(八)分分钟学会Springboot多种解决跨域方式mvc

SpringBoot系列(九)单,多文件上传的正确姿式app

SpringBoot系列(十)优雅的处理统一异常处理与统一结果返回

目录

1. 拦截器介绍

 拦截器是在servlet执行以前执行的程序(这里就是controller代码执行以前),它主要是用于拦截用户请求并做相应的处理,好比说能够判断用户是否登陆,作相关的日志记录,也能够作权限管理。

 SpringBoot中的拦截器实现和spring mvc 中是同样的,它的大体流程是,先本身定义一个拦截器类,并将这个类实现一个HandlerInterceptor类,或者是继承HandlerInterceptorAdapter,均可以实现拦截器的定义。而后将本身定义的拦截器注入到适配器中,也有两种方式,一种是实现WebMvcConfigurer接口,一种是继承WebMvcConfigurerAdapter。下面咱们来看看如何完成。

2.自定义拦截器

直接上代码,再进行一些代码讲解。

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("进入拦截器了");
        //中间写逻辑代码,好比判断是否登陆成功,失败则返回false
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        //
        System.out.println("controller 执行完了");
    }


    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("我获取到了一个返回的结果:"+response);
        System.out.println("请求结束了");
    }
}

代码说明:

  1. 自定义的拦截器能够实现HandlerInterceptor接口,也能够继承HandlerInterceptorAdapter类。
  2. 重写三个方法,固然也能够只实现一个最重要的preHandle方法。
  3. preHandle方法:此方法会在进入controller以前执行,返回Boolean值决定是否执行后续操做。
  4. postHandle方法:此方法将在controller执行以后执行,可是视图尚未解析,可向ModelAndView中添加数据(先后端不分离的)。
  5. afterCompletion方法:该方法会在整个请求结束(请求结束,可是并未返回结果给客户端)以后执行, 可获取响应数据及异常信息。

3.拦截器注入适配器

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/**")//拦截全部的路径
                .excludePathPatterns("/LoginController/login");
    }
}

代码说明:

  1. 经过实现WebMvcConfigurer接口能够自定义一个适配器,也能够经过继承WebMvcConfigurerAdapter来定义适配器,建议使用第一种,第二种已是过期的方法了。
  2. 重写addInterceptors方法,addInterceptor方法是将拦截器注入到适配器中。
  3. addPathPatterns方法是设置一个须要拦截的路径,能够是多个字符串或者是直接传入一个数组。
  4. excludePathPatterns是配置不须要拦截的路径。
  5. 须要加上configuration注解说明这是一个配置类,在项目启动的时候自动执行。

4.controller测试

 先建立一个登录的测试,这个接口是不会拦截的。

@RestController
@RequestMapping("LoginController")
public class Login {
    @RequestMapping("/login")
    public String login(){
        System.out.println("controller开始执行");
        return "login success";
    }
}

 建立一个拦截的controller

@RestController
@RequestMapping("/hello")
public class HelloController {
    @RequestMapping("/hello")
    public String hello(){
        System.out.println("通过拦截的controller代码执行完毕");
        return "hello";
    }
}

5. 测试

  1. 测试未拦截的接口,浏览器输入:localhost:8097/LoginController/login,查看控制台输出状况。

    控制台只输出了未拦截接口内的代码,说明这个接口是未拦截的。浏览器的显示就无论了。其实通常是拦截登陆接口,这里就将它放开了,以供测试。

  2. 测试拦截的接口,浏览器输入:localhost:8097/hello/hello,查看控制台输出状况。

    能够看到,首先是进入了拦截器,经过拦截器以后,进入了controller中的方法,执行完controller的代码以后就进入了自定义拦截器中的postHandle方法,最后进入afterCompletion方法,并获取到了一个response对象。

6. 扩展内容:拦截器链

 咱们能够定义多个拦截器组成一个拦截器链。咱们能够在适配器中注入多个拦截器。多加一行代码就好了。

 按照拦截器注入的顺序,拦截器的执行顺序应该是一下顺序:拦截器1,拦截器2,拦截器2处理,拦截器1处理,拦截器2结束,拦截器1结束。对应三个过程的方法就是preHandle,postHandle,afterCompletion

7. 总结

 本文从拦截器的自定义到自定义适配器,而后将拦截器注入适配器,再到编写测试代码。准备工做完成以后就进行一个测试拦截器是否成功,最后扩展出拦截器链的一些内容。若是你以为本文对你有用,三连走起!

相关文章
相关标签/搜索