RESTful API的拦截

三种拦截方式

1.过滤器(Filter)

  1)implement Filter
  2-1)自定义的filter可以使用component交给spring管理,从而让filter起作用,所有的url都会经过这个 
     过滤器
  2-2)使用第三方的filter可以通过下面的方式去进行:
      @Configuration
      public class WebConfig{	
      @Bean
      public FilterRegistrationBean timeFilter() {
	
          FilterRegistrationBean registrationBean = new FilterRegistrationBean();
	
          TimeFilter timeFilter = new TimeFilter();
          registrationBean.setFilter(timeFilter);
	
          List<String> urls = new ArrayList<>();
          urls.add("/*");//过滤器只拦截指定的url
          registrationBean.setUrlPatterns(urls);
	
          return registrationBean;
       }
      }

2.拦截器(Interceptor)

   1)
    @Component
    public class TimeInterceptor implements HandlerInterceptor{}
   2)
    @Configuration
    public class WebConfig extends WebMvcConfigurerAdapter {

     @Autowired
     private TimeInterceptor timeInterceptor;

     @Override
     public void addInterceptors(InterceptorRegistry registry) {
	 registry.addInterceptor(timeInterceptor);
     }
    }

3.切片(Aspect)

   @Aspect
   @Component
   public class TimeAspect {

   @Around("execution(* com.imooc.web.controller.UserController.*(..))")
   public Object handleControllerMethod(ProceedingJoinPoint pjp) throws Throwable {
	
	System.out.println("time aspect start");
	
	Object[] args = pjp.getArgs();
	for (Object arg : args) {
		System.out.println("arg is "+arg);
	}
	
	long start = new Date().getTime();
	
	Object object = pjp.proceed();
	
	System.out.println("time aspect 耗时:"+ (new Date().getTime() - start));
	
	System.out.println("time aspect end");
	
	return object;
   }
   }

过滤器可以拿到原始http请求和响应信息,但是拿不到真正处理这个请求的方法的信息;
拦截器可以拿到原始http请求和响应信息,也可以拿到真正处理这个请求的方法的信息,但是拿不到方法被真正调用的时候的参数传递的值;
切片可以拿到方法被真正调用的时候的参数传递的值。但是拿不到原始http请求和响应信息。

拦截顺序

controllerAdvice是处理异常的

posted @ 2020-03-25 17:16  cherishDouble  阅读(343)  评论(0编辑  收藏  举报