spring 拦截器 HandlerInterceptor

简介

拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作。在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。

主要工作场景

拦截器可以获取IOC容器中的各个bean,而过滤器就不行,所以在拦截器里注入一个service,可以调用业务逻辑。
拦截器只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。

WebMvcConfigurerAdapter 比较常用的重写接口


/** 添加类型转换器和格式化器 */
public void addFormatters(FormatterRegistry registry)
/** 解决跨域问题 **/
public void addCorsMappings(CorsRegistry registry) ;
/** 配置消息转换器 */
public void configureMessageConverters(List<HttpMessageConverter<?>> converters)
/** 添加拦截器 **/
void addInterceptors(InterceptorRegistry registry);
/** 这里配置视图解析器 **/
void configureViewResolvers(ViewResolverRegistry registry);
/** 配置内容裁决的一些选项 **/
void configureContentNegotiation(ContentNegotiationConfigurer     configurer);
/** 视图跳转控制器 **/
void addViewControllers(ViewControllerRegistry registry);
/** 静态资源处理 **/
void addResourceHandlers(ResourceHandlerRegistry registry);
/** 默认静态资源处理器 **/
void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer);

#添加拦截器

 @Override
 public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new ReqInterceptor()).addPathPatterns("/**");
}

实现自定义拦截器

public class ReqInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("拦截器--preHandle");
    return super.preHandle(request, response, handler);
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    System.out.println("拦截器--postHandle");
    super.postHandle(request, response, handler, modelAndView);
}

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

@Override
public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("拦截器--afterConcurrentHandlingStarted");
    super.afterConcurrentHandlingStarted(request, response, handler);
}
}

测试用例

@GetMapping("/filter/{id}")
public void filter(@PathVariable("id") Long id) {
    System.out.println("Controller方法--前");
    UserEntity userEntity = userService.findUserById(id);
    System.out.println("Controller方法--后");
}

运行结果

spring 拦截器 HandlerInterceptor

上一篇:SpringBoot-Security-用户权限分配-配置验证规则


下一篇:Kafka 消息队列 Java版