Springboot 拦截器

拦截器是什么?

简单的来说,就是一道阀门,在某个方法被访问之前,进行拦截,然后在之前或之后加入某些操作,拦截器是AOP 的一种实现策略。

拦截器主要做什么?

对正在运行的流程进行干预。

拦截器的代码实现。

拦截器也主要有三个方法:
其中preHandle是在请求之前就进行调用,如果该请求需要被拦截,则返回false,否则true;
postHandle是在请求之后进行调用,无返回值;
afterCompletion是在请求结束的时候进行调用,无返回值。

那么在 springBoot 中如何使用拦截器呢?

步骤:创建一个类实现 HandlerInterceptor 接口,再创建一个配置类实现 WebMvcConfigurer接口 ,重写 addInterceptors 方法。

  1. 创建我们自己的拦截器类并实现 HandlerInterceptor 接口。
public class MyInterceptor implements HandlerInterceptor {
    @Value("${open.url}")
    private String openUrl;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object
handler) throws Exception {
        System.out.println("MyInterceptor....在请求处理之前进行调用(Controller方法调用之前)");
        String requestUrl=request.getRequestURI();
        System.out.println("过滤器MyFilter拦截了请求为"+requestUrl);
        return true;
   }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object
handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor...请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之
后)");
   }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object
handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor....在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对
应的视图之后执行(主要是用于进行资源清理工作)");
   }
}
  1. 修改 application.properties 加入开发接口通配地址
#凡是请求地址层级带有 open 都放行
open.url=/**/open/**
  1. 创建一个 Java 实现 WebMvcConfigurer ,并重写 addInterceptors 方法。
@Configuration
public class WebAppConfig implements WebMvcConfigurer {
    @Value("${open.url}")
    private String openUrl;
    @Bean
    public MyInterceptor getMyInterceptor(){
        return new MyInterceptor();
   }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
          registry.addInterceptor(getMyInterceptor()).addPathPatterns("/api/**").excludePathPatterns(openUrl);
    }
}
  1. 创建开放首页接口
@RestController
@RequestMapping("/api")
public class InterceptorController {
       @GetMapping("/home/open/info")
    public String home(){
        return "欢迎来到首页";
   }
    @GetMapping("/user/interceptor")
    public String interceptor(){
        return "我被拦截了并通过了拦截器";
   }
}
  1. 测试
    带有open http://localhost:8080/api/open/home/info不拦截
    image.png

    image.png

拦截校验用户是否登录实战

  1. 加入需要权鉴接口、未登录接口
    @GetMapping("/user/filter")
    public String testFilter(){
        return "已经通过了拦截器";
    }
    @GetMapping("/open/unLogin")
    public String getUnauthorized(){
        return "登录失效,请重新登录";
    }
  1. 修改拦截器校验逻辑
public class MyInterceptor implements HandlerInterceptor {
    @Value("${open.url}")
    private String openUrl;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor....在请求处理之前进行调用(Controller方法调用之前)");
        System.out.println("MyInterceptor 拦截了请求为"+requestUrl);
        String requestUrl=request.getRequestURI();
        System.out.println(requestUrl+"被 MyInterceptor 拦截了");
        //判断是否携带凭证就可以了
        String token = request.getHeader("token");
        if(StringUtils.isEmpty(token)){
            request.getRequestDispatcher("/api/open/unLogin").forward(request,response);
            return false;
        }
        return true;
         }
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor...请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor....在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
    }
}
  1. 测试
    首先访问 开放接口


    image.png

    访问需权鉴接口
    带 token


    image.png

    不带 token
    image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。