Interceptor拦截器和Filter过滤器 和 Aspect切面

我们用拦截器 和过滤器 分别实现一个需求: 那就是在运行一次请求所用了多少的时间

1.过滤器:

//@Component
@Slf4j
public class TimeFilter implements Filter {


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("timeFile init");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("timeFilter start");
        Long startTime = new Date().getTime();
        filterChain.doFilter(servletRequest,servletResponse);
        log.info("共用时间:{}",new Date().getTime() - startTime);
        log.info("timeFilter finish");

    }

    @Override
    public void destroy() {
        log.info("timeFile end");
    }
}

实现了Filter接口,init->filter初始化,在tomcat启动的时候就会运行 

doFilter()->里面有三个参数,request,response就不多说了, filterChain.doFilter();就是放行的。

 

如果你还想配置过滤器:

(SpringBOOT)我们新建一个类 WebConfig

@Configuration
public class WebConfig   {
    @Bean
        public FilterRegistrationBean  timeFilter(){
            FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
            filterRegistrationBean.setFilter(new TimeFilter());
            List<String> urlPartterns = new ArrayList<>();
            urlPartterns.add("/*");
            filterRegistrationBean.setUrlPatterns(urlPartterns);
            return filterRegistrationBean ;
        }

}

我们把这个FilterRegistrationBean写进容器 这样就可以起到作用了 

 

2.拦截器

@Component
@Slf4j
public class TimeInterceptor implements HandlerInterceptor {


    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception {
        log.info("preHandler..");
        log.info("进入的类名:{}", ((HandlerMethod) handler).getBean().getClass().getName());
        log.info("进入的方法名:{}", ((HandlerMethod) handler).getMethod().getName());
        httpServletRequest.setAttribute("current_time", new Date().getTime());
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        log.info("进入postHandler...");
        Long current_time = (Long) httpServletRequest.getAttribute("current_time");
        log.info("运行时间为:{}", Math.abs(current_time - (new Date().getTime())));


    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        log.info("进入afterCompletion......");
        Long current_time = (Long) httpServletRequest.getAttribute("current_time");
        log.info("运行时间为:{}", Math.abs(current_time - (new Date().getTime())));
        log.info("异常为:{}",e);
    }
}

 

定义一个拦截器 实现HandlerInterceptor 

preHandler()-->注意里面有一个参数 那就是Object  handler  这个参数就是我们即将运行的那个方法 

我们需要把这个参数转换为 HandlerMethod  在进行操作 返回true的话就是放行,返回false的话就是拦截。

postHandler()--->这个方法如果运行的方法抛出的异常那么这个postHandler()方法就不会在运行。

afterCompletion()--->这个方法无论一定会执行 , 如果有异常 可以打印出。

好 ,最后一步我们需要在webconfig配置


@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Autowired
    private TimeInterceptor timeInterceptor;


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(timeInterceptor);
    }
}

这个webConfig需要继承 WebMvcConfigurerAdapter  并且覆盖addInterceptor方法 。

 

3.Aspect切片

@Aspect
@Component
@Slf4j
public class TimeAspect {


    @Around("execution(public *  com.yumin.security.yuminsecuritydemo.web.controller.UserController.*(..))")
    public Object handlerControllerMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        log.info("切面的方法进入");
        Object[] args = proceedingJoinPoint.getArgs();
        for (Object o :
                args) {
            System.out.println(o);
        }
        Long startTime = new Date().getTime();
        Object proceed = proceedingJoinPoint.proceed();
        log.info("proceed:{}",((Person)proceed).getName());
        log.info("time aspect耗时:{}", new Date().getTime() - startTime);
        return proceed;
    }

}

需要主要的是: 

在写这个Aspect里面的方法的参数为 ProceedingJointPoint

这里面的getArgs()是得到参数 

proceedJointPoint.getPreceed()得到的是结果对象 return  proceed;这样才可以

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
filter过滤器拦截器是Web开发中常用的两种组件,它们在请求处理过程中起到了类似于"中间件"的作用,用于对请求进行处理和拦截。 Filter过滤器是Servlet规范中定义的一种组件,它可以对请求进行预处理和后处理。Filter可以拦截特定的URL请求,对请求进行处理,并将请求传递给下一个过滤器或Servlet。Filter可以用于对请求进行身份验证、日志记录、编码转换、资源过滤等等操作。一个应用可以配置多个Filter,它们按照配置的顺序依次执行。 拦截器是在Spring框架中使用的一种组件,它也可以对请求进行预处理和后处理。拦截器的使用更加灵活,可以对请求进行更加细粒度的控制。拦截器可以拦截Controller方法的调用,在方法执行前后做一些处理,例如身份验证、日志记录、性能监控等。一个应用可以配置多个拦截器,它们按照配置的顺序依次执行。 在使用上,filterinterceptor有一些区别: - Filter是基于Servlet规范的,而Interceptor是Spring框架提供的; - Filter可以对所有的请求进行拦截,而Interceptor可以对Controller方法进行拦截; - Filter只能通过web.xml或注解进行配置,而Interceptor可以通过Java代码进行配置; - Interceptor可以访问Spring的上下文,而Filter不能。 总结来说,filterinterceptor都可以用于对请求进行处理和拦截,但是它们的具体实现和使用方式有一些差异。在使用时,可以根据具体需求选择适合的组件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值