SpringBoot 拦截RestFul 服务

SpringBoot 拦截RestFul 服务

使用拦截器

  1. 使用@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;
}
  1. 光有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

原文地址:https://www.cnblogs.com/fjf3997/p/13023525.html