SpringBoot 拦截RestFul 服务
使用拦截器
- 使用@Component注解并继承HandlerInterceptor接口,拦截的controller类中的方法
@Component
public class CustomInterceptor implements HandlerInterceptor {
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){}
throws Exception;
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView){}
throws Exception;
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex){}
throws Exception;
}
- 光有component类还不够,还需要配置,继承WebMvcConfigurerAdapter类,并覆盖addInterceptors方法
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Autowired
private TimeInterceptor timeInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(timeInterceptor);
}
}
使用过滤器
法1:使用@Component注解并实现Filter接口,会拦截一切请求
@Component
public class TimeFilter implements Filter {
void init(FilterConfig var1) throws ServletException;
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
void destroy();
}
法二:配置类,注册FilterRegistrationBean,可以通过setUrlPatterns方法指定过滤的路径
@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("/*");
registrationBean.setUrlPatterns(urls);
return registrationBean;
}
}
使用切片
- 使用@Aspect注解声明是一个切片类,使用@Around注解中的execution属性配置切入点,此方法可以获得controller方法的参数
@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;
}
}
请求处理顺序
- 来一个请求时:
Filter->Intercor->Aspect->Controller,返回数据则相反
- 产生异常情况下返回时
Controller->Aspect->Advice->Interceptor->Filter