zoukankan      html  css  js  c++  java
  • 使用切片拦截Rest服务

    1.使用过滤器Filter:

    我们可以在建立的springboot的项目中建立新的类来是先Filter的接口,doFilter是过滤器中的主要方法,用来做处理逻辑,最后我们只需要在类上加@Component注解就可以让过滤器生效了.

    package com.city.web;
    
    import org.springframework.stereotype.Component;
    import javax.servlet.*;
    import java.io.IOException;
    import java.util.Date;
    
    @Component
    public class TimeFilter implements Filter {
    
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("time filter init!");
        }
    
        @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);
            System.out.println("time filter:"+(new Date().getTime()-start));
    
            System.out.println("time filter finish");
        }
    
        @Override
        public void destroy() {
            System.out.println("time filter destroy!");
        }
    }
    
    

    当然我们也可以不用@Component注解,但是需要建一个配置类,也可以让过滤器生效,如下:

    package com.city.web.configer;
    
    import com.city.web.TimeFilter;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import java.util.ArrayList;
    import java.util.List;
    
    @Configuration
    public class WebConfig {
    
        @Bean
        public FilterRegistrationBean timeFilter2(){
    
            FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
    
            TimeFilter timeFilter = new TimeFilter();
    
            filterRegistrationBean.setFilter(timeFilter);
    
            List<String> urls = new ArrayList<>();
    
            urls.add("/*");
    
            filterRegistrationBean.setUrlPatterns(urls);
    
            return  filterRegistrationBean;
        }
    }
    
    

    2.使用拦截器HandlerInterceptor

    建立TimeInterecepter实现HandlerInterceptor,如下:

    package com.city.web.interecepter;
    
    import org.springframework.stereotype.Component;
    import org.springframework.web.method.HandlerMethod;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.util.Date;
    
    @Component
    public class TimeInterecepter implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("preHandle");
            request.setAttribute("startTime", new Date().getTime());
            System.out.println(((HandlerMethod) handler).getBean().getClass().getName());
            System.out.println(((HandlerMethod) handler).getMethod().getName());
            return true; //这里控制是否调用后面的方法 建议返回true
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("preHandle");
            Long start = (Long) request.getAttribute("startTime");
            System.out.println("time intercepter 耗时:" + (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 intercepter 耗时:" + (new Date().getTime() - start));
            System.out.println("ex is "+ex);
    
        }
    
    }
    
    

    这里的类写好后还必须在配置类中配置这个拦截器才会使其生效,如下所示:

    package com.city.web.configer;
    
    import com.city.web.TimeFilter;
    import com.city.web.interecepter.TimeInterecepter;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    
    import java.util.ArrayList;
    import java.util.List;
    
    @Configuration
    public class WebConfig  extends WebMvcConfigurerAdapter {
    
        @Autowired
        private TimeInterecepter timeInterecepter;
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(timeInterecepter);
        }
    
    
    }
    
    

    3.使用切片:

    image.png

    比如我们要切入DemoApplication这个类中:

    package com.city.web.aspect;
    
    import com.navercorp.pinpoint.common.annotations.InterfaceAudience;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.AfterThrowing;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.springframework.stereotype.Component;
    import java.security.PublicKey;
    import java.util.Date;
    
    @Aspect
    @Component
    public class TimeAspect {
    
        @Around("execution(* com.city.DemoApplication.*(..))")
        public Object handleControllerMethod(ProceedingJoinPoint pjp) throws Throwable {
    
            long start = new Date().getTime();
            Object[] args = pjp.getArgs();
            for (Object arg : args) {
                System.out.println("arg is "+arg);
            }
    
            System.out.println("time aspect start");
            Object object = pjp.proceed();
    
            System.out.println("time aspect 耗时:"+(new Date().getTime()-start));
    
            System.out.println("time aspect end");
    
            return object;
        }
    
    }
    
    

    关于restful的API拦截的处理层级关系:

    image.png

  • 相关阅读:
    Mac ssh登陆linux并且显示linux图形
    github proxy
    [makefile] filter-out
    linux svn
    界面UI测试的方法
    UI测试
    web 页面中 四种常见 必测控件
    面试工作经验参考
    测试用例
    接口测试基础
  • 原文地址:https://www.cnblogs.com/charlypage/p/10493335.html
Copyright © 2011-2022 走看看