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;
       }
    }
    

      

  • 相关阅读:
    0x00 mysql 的安装,简单mysql命令的使用
    nuxt中定制iview主题颜色
    获取浏览器语言的解决方案
    nuxt页面切换效果
    MySQL(非sql sever)安全体系的学习心得
    My SQL日志 学习心得
    楼梯在SQL Server事务日志管理,三级:事务日志,备份和恢复(16周翻译)
    SQL Server事务日志管理的阶段,1级:事务日志概述
    楼梯在SQL Server事务日志管理,一级:事务日志的概述(15周翻译)
    数据库的独立子查询以及数据的删除、更新和建立视图的笔记
  • 原文地址:https://www.cnblogs.com/412013cl/p/14053607.html
Copyright © 2011-2022 走看看