RESTful API的拦截:过滤器Filter、拦截器Interceptor、切片Aspect

过滤器能够过滤请求,但是不能够拿到是哪个controller的哪个方法

拦截器能拿到controller的那个方法,但是不能拿到方法的请求参数值

切片能够拿到详细的请求参数值

三者执行顺序

Filter -> Interceptor -> Aspect ->Controller

一、过滤器Filter

(不知道是哪个控制器以及哪个方法来处理的)

需求:通过过滤器计算服务请求时间

新建TimeFilter.java,实现Filter

@Component//加上次注解,自动被spring注入
public class TimeFilter implements Filter{
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("拦截初始化,在项目启动的时候执行");
	}

	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

		long start = System.currentTimeMillis();
		filterChain.doFilter(servletRequest,servletResponse);
		long end = System.currentTimeMillis();
		System.out.println("花费时间:"+(end-start)+"毫秒");
	}

	@Override
	public void destroy() {
		
	}
}

如果不适用@component注解,也可以使用@configuration注解实现过滤器的注入

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
	
	@Bean
	public FilterRegistrationBean getBean(){
		FilterRegistrationBean registrationBean = new FilterRegistrationBean();
		TimeFilter timeFilter = new TimeFilter();

		registrationBean.setFilter(timeFilter);
		List<String> urls = new ArrayList<>();
		urls.add("/hello");
		registrationBean.setUrlPatterns(urls);
		return registrationBean;
	}
}

二、拦截器的使用

新建TimeInterceptor.java实现 HandlerInterceptor

@Component
public class TimeInterceptor implements HandlerInterceptor{
    private Logger logger = LoggerFactory.getLogger(TimeInterceptor.class);
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.println("preHandle");long start = new Date().getTime();
        httpServletRequest.getSession().setAttribute("start",start);
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");long start = (long)httpServletRequest.getSession().getAttribute("start");
        System.out.println("花费时间:"+(new Date().getTime() - start));
        String name = ((HandlerMethod) o).getBean().getClass().getName();
        String method = ((HandlerMethod) o).getMethod().getName();
        MethodParameter[] methodParameters = ((HandlerMethod) o).getMethodParameters();
        logger.info("访问的是"+name + "方法:"+method+"参数"+methodParameters.toString());
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

        System.out.println("afterCompletion");

    }

第二步:把服务注册到mvc

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
	@Autowired
	public TimeInterceptor timeInterceptor;

	@Override
	public void addInterceptors(InterceptorRegistry registry) {

		registry.addInterceptor(timeInterceptor).addPathPatterns("/user/*");
	}
}

三、切片Aspect,通过注解来标注过滤方法

新建TimeAspect.java

@Aspect
@Component
public class TimeAspect {
    @Around("execution(* com.imooc.web.controller.UserController.*(..))")
    //返回类型 方法 (..)参数
    public Object doAroundMethod(ProceedingJoinPoint pjd) throws Throwable {

        System.out.println("========1=====");
        Object[] args = pjd.getArgs();
        for (int i = 0; i < args.length; i++) {
            System.out.println(args[i].toString());
        }
        Object result  = pjd.proceed();
        System.out.println("========2=====");
        return result;
    }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值