简介
拦截器是基于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方法--后"); }
运行结果
热门工具 换一换