zoukankan      html  css  js  c++  java
  • SpringBoot(11) SpringBoot自定义拦截器

    自定义拦截器共两步:第一:注册。第二:定义拦截器。

    一、注册 @Configuration

    继承WebMvcConfigurationAdapter(SpringBoot2.X之前旧版本)

    旧版本代码

     1 @Configuration
     2 public class CustomOldWebMvcConfigurer extends WebMvcConfigurerAdapter {
     3 
     4     @Override
     5     public void addInterceptors(InterceptorRegistry registry) {
     6 
     7         registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/api/");
     8         
     9         super.addInterceptors(registry);
    10     }
    11 
    12 }

    SpringBoot2.X 新版本配置拦截器 implements WebMvcConfigurer

    新版本代码

     1 @Configuration
     2 public class CustomWebMvcConfigurer implements WebMvcConfigurer  {
     3 
     4     @Override
     5     public void addInterceptors(InterceptorRegistry registry) {
     6 
     7         registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/api2/*/**").excludePathPatterns("/api2/xxx/**");;
     8         registry.addInterceptor(new TwoIntercepter()).addPathPatterns("/api2/*/**");
     9         WebMvcConfigurer.super.addInterceptors(registry);
    10     }
    11 
    12 }

    二、定义拦截器 HandlerInterceptor

    1、LoginIntercepter

     1 public class LoginIntercepter implements HandlerInterceptor{
     2 
     3     /**
     4      * 进入controller方法之前
     5      */
     6     @Override
     7     public boolean preHandle(HttpServletRequest request,
     8             HttpServletResponse response, Object handler) throws Exception {
     9         System.out.println("LoginIntercepter------->preHandle");
    10 
    11 //        String token = request.getParameter("access_token");
    12 //        
    13 //        response.getWriter().print("fail");
    14 //        return true;
    15         return HandlerInterceptor.super.preHandle(request, response, handler);
    16     }
    17 
    18     /**
    19      * 调用完controller之后,视图渲染之前
    20      */
    21     @Override
    22     public void postHandle(HttpServletRequest request,
    23             HttpServletResponse response, Object handler,
    24             ModelAndView modelAndView) throws Exception {
    25         
    26         System.out.println("LoginIntercepter------->postHandle");
    27         
    28         HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    29     }
    30 
    31     /**
    32      * 整个完成之后,通常用于资源清理
    33      */
    34     @Override
    35     public void afterCompletion(HttpServletRequest request,
    36             HttpServletResponse response, Object handler, Exception ex)
    37             throws Exception {
    38         System.out.println("LoginIntercepter------->afterCompletion");
    39         
    40         HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    41     }
    42     
    43 }

    2、TwoIntercepter

     1 public class TwoIntercepter implements HandlerInterceptor{
     2 
     3     /**
     4      * 进入对应的controller方法之前
     5      */
     6     @Override
     7     public boolean preHandle(HttpServletRequest request,
     8             HttpServletResponse response, Object handler) throws Exception {
     9 
    10         System.out.println("TwoIntercepter------>preHandle");
    11         
    12         //return true;
    13         return HandlerInterceptor.super.preHandle(request, response, handler);
    14     }
    15 
    16     /**
    17      * controller处理之后,返回对应的视图之前
    18      */
    19     @Override
    20     public void postHandle(HttpServletRequest request,
    21             HttpServletResponse response, Object handler,
    22             ModelAndView modelAndView) throws Exception {
    23         System.out.println("TwoIntercepter------>postHandle");
    24         HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    25     }
    26 
    27     /**
    28      * 整个请求结束后调用,视图渲染后,主要用于资源的清理
    29      */
    30     @Override
    31     public void afterCompletion(HttpServletRequest request,
    32             HttpServletResponse response, Object handler, Exception ex)
    33             throws Exception {
    34         System.out.println("TwoIntercepter------>afterCompletion");
    35         HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    36     }
    37 
    38     
    39 }

    注:

    1. 三个重载方法说明

    preHandle:调用Controller某个方法之前

    postHandle:Controller之后调用,视图渲染之前,如果控制器Controller出现了异常,则不会执行此方法

    afterCompletion:不管有没有异常,这个afterCompletion都会被调用,用于资源清理

    2.顺序

    按照注册顺序进行拦截,先注册,先被拦截

    三、拦截器不生效常见问题:

    1)是否有加@Configuration
    2)拦截路径是否有问题 ** 和 *
    3)拦截器最后路径一定要 “/**”, 如果是目录的话则是 /*/

    四、过滤器与拦截器的区别

    Filter是基于函数回调 doFilter(),而Interceptor则是基于AOP思想

    Filter在只在Servlet前后起作用,而Interceptor够深入到方法前后、异常抛出前后等

    依赖于Servlet容器即web应用中,而Interceptor不依赖于Servlet容器所以可以运行在多种环境。

    在接口调用的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。

    Filter和Interceptor的执行顺序:过滤前->拦截前->action执行->拦截后->过滤后

  • 相关阅读:
    k64 datasheet学习笔记26--Oscillator (OSC)
    k64 datasheet学习笔记22---Direct Memory Access Controller (eDMA)
    k64 datasheet学习笔记21--Direct Memory Access Multiplexer (DMAMUX)
    System.getProperty()获取系统的配置信息
    Zoomit的用法总结
    .bat文件调用java类的main方法
    电脑快捷键总结
    验证java引用的小例子
    java随机数
    java调用删除文件的方法删除文件,却删除不干净
  • 原文地址:https://www.cnblogs.com/platycoden/p/9813814.html
Copyright © 2011-2022 走看看