乐趣区

关于springboot:SpringBoot-使用拦截器

SpringBoot 应用拦截器

拦截器有什么用

  1. 通过重写 preHand() 办法在申请发送到控制器之前执行操作。
  2. 通过重写 postHand() 办法在响应产生到客户端之前执行操作。
  3. 通过从新 afterCompletion() 办法在实现申请和响应之后执行操作。

怎么应用拦截器

定义拦截器

实现 HandlerInterceptor 接口并重写须要的办法,并通过 @Component 注解将拦截器注入到 Spring 容器中。

@Component
public class TestInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {System.out.println("preHandle");
        return true;
    }

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

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion");
    }
    
}

注册拦截器

实现 WebMvcConfigurer 接口,并通过 addInterceptors() 办法注册拦截器,同时能够通过 addPathPatterns()、excludePathPatterns() 办法指定拦截器拦挡的范畴。

@Component
public class TestInterceptorConfig implements WebMvcConfigurer {
    
    @Autowired
    TestInterceptor interceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(interceptor).addPathPatterns("/test1");
    }
}

编写控制器测试

@RestController
public class TestController {@GetMapping("/test1")
    public String test1() {System.out.println("Hello, world");
        return "Hello, world.";
    }
}

测试后果

preHandle
Hello, world
postHandle
afterCompletion

多个拦截器的调用程序

当增加多个拦截器时,拦截器调用的程序如下:

addInterceptor(AInterceptor);
addInterceptor(BInterceptor);
addInterceptor(CInterceptor);

调用后果如下:

preHandelerA
preHandelerB
preHandelerC
postHandlerC
postHandlerB
postHandlerA
afterCompletionC
afterCompletionB
afterCompletionA

拦截器的应用场景

  • 记录接口响应相干信息:记录接口的拜访门路、参数和响应工夫等参数用于排查问题。
  • 用户登录查看:判断用户是否登录,设置 session 等相干信息。
  • 用户权限查看:应用注解和拦截器实现权限治理。
    具体实现可参考🔗。
退出移动版