往期推荐
SpringBoot系列(一)idea新建Springboot项目
SpringBoot系列(二)入门知识
springBoot系列(三)配置文件详解
SpringBoot系列(四)web静态资源配置详解
SpringBoot系列(五)Mybatis整合完整详细版
SpringBoot系列(六)集成thymeleaf详解版
Springboot系列(七) 集成接口文档swagger,使用,测试
SpringBoot系列(八)一文轻松解决跨域问题
SpringBoot系列(九)单,多文件上传的正确姿势
SpringBoot系列(十)统一异常处理与统一结果返回
目录
拦截器是在servlet执行之前执行的程序(这里就是controller代码执行之前),它主要是用于拦截用户请求并作相应的处理,比如说可以判断用户是否登录,做相关的日志记录,也可以做权限管理。
SpringBoot中的拦截器实现和spring mvc 中是一样的,它的大致流程是,先自己定义一个拦截器类,并将这个类实现一个HandlerInterceptor类,或者是继承HandlerInterceptorAdapter,都可以实现拦截器的定义。然后将自己定义的拦截器注入到适配器中,也有两种方式,一种是实现WebMvcConfigurer接口,一种是继承WebMvcConfigurerAdapter。下面我们来看看如何完成。
直接上代码,再进行一些代码讲解。
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("请求结束了");
}
}
代码说明:
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**")//拦截所有的路径
.excludePathPatterns("/LoginController/login");
}
}
代码说明:
先创建一个登陆的测试,这个接口是不会拦截的。
@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";
}
}
测试未拦截的接口,浏览器输入:localhost:8097/LoginController/login,查看控制台输出情况。
控制台只输出了未拦截接口内的代码,说明这个接口是未拦截的。浏览器的显示就不管了。其实一般是拦截登录接口,这里就将它放开了,以供测试。
测试拦截的接口,浏览器输入:localhost:8097/hello/hello,查看控制台输出情况。
可以看到,首先是进入了拦截器,通过拦截器之后,进入了controller中的方法,执行完controller的代码之后就进入了自定义拦截器中的postHandle方法,最后进入afterCompletion方法,并获取到了一个response对象。
我们可以定义多个拦截器组成一个拦截器链。我们可以在适配器中注入多个拦截器。多加一行代码就行了。
按照拦截器注入的顺序,拦截器的执行顺序应该是一下顺序:拦截器1,拦截器2,拦截器2处理,拦截器1处理,拦截器2结束,拦截器1结束。对应三个过程的方法就是preHandle,postHandle,afterCompletion。
本文从拦截器的自定义到自定义适配器,然后将拦截器注入适配器,再到编写测试代码。准备工作完成之后就进行一个测试拦截器是否成功,最后扩展出拦截器链的一些内容。如果你觉得本文对你有用,三连走起!