• 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

  • 相关阅读:
    列表的创建02
    python如何设置注释模板,文件模板
    python语言使用rsa密码算法对数据加密时不能对中文加密问题的解决
    python编码解码,字符数据转换问题(自学笔记)
    字符串与数组之间的互相转换
    vc++文本编辑
    OCP 062【中文】考试题库(cuug内部资料)第28题
    OCP 062【中文】考试题库(cuug内部资料)第27题
    OCP 062【中文】考试题库(cuug内部资料)第26题
    OCP 062【中文】考试题库(cuug内部资料)第25题
  • 原文地址:https://www.cnblogs.com/fjf3997/p/13023525.html
Copyright © 2020-2023  润新知