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 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  阅读(372)  评论(0)    收藏  举报