简介
拦截器是基于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方法--后");
}