zoukankan      html  css  js  c++  java
  • RESTful API的拦截方式 (过滤器Filter)拦截器(Interceptor)切片(Aspect)

    优先级按排序

    1 过滤器(Filter)   最先进入拦截,只能获取到response,request 
    2 拦截器(Interceptor) 可以获取到执行的类名,方法名
    3 切片(Aspect) 可以获取到参数

    具体使用哪一个看业务需求吧.

    1 过滤器(Filter)

    自定义Filter

    package com.imooc.web.filter;
    import org.springframework.stereotype.Component;
    import java.io.IOException;
    import java.util.Date;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    @Component  // 增加一个注解即可使用,不需要其他配置,会拦截所有请求
    public class TimeFilter implements Filter {
    	@Override
    	public void destroy() {
    		System.out.println("time filter destroy");
    	}
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    			throws IOException, ServletException {
    		System.out.println("time filter start");
    		long start = new Date().getTime();
    		chain.doFilter(request, response); // 继续执行程序,不调用doFilter 不会往下执行
    		System.out.println("time filter 耗时:"+ (new Date().getTime() - start));
    		System.out.println("time filter finish");
    	}
    	@Override
    	public void init(FilterConfig arg0) throws ServletException {
    		// 程序启动会加载
    		System.out.println("time filter init");
    	}
    }
    

      如果是引用第三方的Filter 使用方法:

    package com.imooc.web.config;
    import java.util.ArrayList;
    import java.util.List;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import com.imooc.web.filter.TimeFilter;
    @Configuration
    public class WebConfig {
    	@Bean
    	public FilterRegistrationBean timeFilter() {
    		// 注册第三方Filter
    		FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    		TimeFilter timeFilter = new TimeFilter();
    		registrationBean.setFilter(timeFilter);
    		// 需要拦截的url
    		List<String> urls = new ArrayList<>();
    		urls.add("/*");
    		registrationBean.setUrlPatterns(urls);
    		return registrationBean;
    	}
    }

    2 拦截器(Interceptor)

      2.1自定义Interceptor

    package com.imooc.web.interceptor;
    import java.util.Date;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.stereotype.Component;
    import org.springframework.web.method.HandlerMethod;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    @Component
    public class TimeInterceptor implements HandlerInterceptor {
    	// 先进入该方法
    	@Override
    	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    			throws Exception {
    		System.out.println("preHandle");
    		System.out.println(((HandlerMethod)handler).getBean().getClass().getName());
    		System.out.println(((HandlerMethod)handler).getMethod().getName());
    		request.setAttribute("startTime", new Date().getTime());
    		return true; // 返回true才能继续执行controller
    	}
    	// 如果Controller方法抛出了异常,不会进入该方法
    	@Override
    	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
    			ModelAndView modelAndView) throws Exception {
    		System.out.println("postHandle");
    		Long start = (Long) request.getAttribute("startTime");
    		System.out.println("time interceptor 耗时:"+ (new Date().getTime() - start));
    
    	}
    	// 不管方法是不是抛出异常 都会进入该方法
    	@Override
    	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
    			throws Exception {
    		System.out.println("afterCompletion");
    		Long start = (Long) request.getAttribute("startTime");
    		System.out.println("time interceptor 耗时:"+ (new Date().getTime() - start));
    		System.out.println("ex is "+ex);
    
    	}
    
    }
    

       2.2 注入自定义的Interceptor

    package com.imooc.web.config;
    
    import com.imooc.web.interceptor.TimeInterceptor;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    @Configuration
    public class TimeInterceptorConfig extends WebMvcConfigurerAdapter {
        // 自定义的Interceptor
        @Autowired
        private TimeInterceptor timeInterceptor;
    
        // 注入spring
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(timeInterceptor);
        }
    
    }
    

    3 切片(Aspect)

    自定义切片

    package com.imooc.web.aspect;
    import java.util.Date;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.springframework.stereotype.Component;
    @Aspect
    @Component
    public class TimeAspect {
       // 切入具体的方法,拦截UserController的所有方法
       @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(); // 继续往下执行Controller
          System.out.println("time aspect 耗时:"+ (new Date().getTime() - start));
          System.out.println("time aspect end");
          return object;
       }
    }
    

      

  • 相关阅读:
    程序返回插入数据库成功,但是数据库内却没有数据
    C++ 使用动态二维数组参数
    深入理解.Net中的内存释放,以及有关的注意事项
    用数据集时,错误:未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值
    关于堆和栈
    C#加密方法总汇
    const与readonly
    struts 将上传文件保存到数据库中
    java Annotation注解的运用
    转:获取汉字的拼音(包括一级和二级)
  • 原文地址:https://www.cnblogs.com/412013cl/p/14053607.html
Copyright © 2011-2022 走看看