关于spring:拦截器过滤器切面比较

52次阅读

共计 1941 个字符,预计需要花费 5 分钟才能阅读完成。

1. 切面

1.1. 切片 (类) @Aspect

@Aspect

UserController.*(..)

1.2. 切入点 (注解) @Around

Around(“execution(* com.niewj.controller.)”)

1.3 加强 (办法)

public Object process(ProceedingJointPoint pjp){
    // 调用前
    Object o = pjp.proceed(); // 1. 调用原办法
    // 调用后
    Object[] args = pjp.getArg(); // 2. 拿参数
    for(Object arg:args){System.out.println("arg is:"+ arg)
    }
}

2. 拦截器

 实现 HandlerInterceptor 接口
继承 HandlerInterceptorAdapter 类 

2.1 preHandler

@Override
public boolean preHandle
    (HttpServletRequest request, 
     HttpServletResponse response, 
     Object handler // Object-> HandlerMethod
    ) throws Exception {return true;}

Controller 的办法被解决之前, preHandler 会被调用;

2.2 postHandler

@Override
public void postHandle
    (HttpServletRequest request, 
     HttpServletResponse response, 
     Object handler, // Object-> HandlerMethod
     ModelAndView modelAndView
    ) throws Exception {}

Controller 的办法被解决之后, postHandle 会被调用, 但有个前提:

  1. preHandler 返回 false
  2. Controller 的办法产生异样

这两种情况都不会调用 postHandler ;

2.3 afterCompletion

@Override
public void afterCompletion
    (HttpServletRequest request, 
     HttpServletResponse response, 
     Object handler, // Object-> HandlerMethod
     Exception ex    // Controller 产生的异样
    ) throws Exception {}

无论 Controller 的办法失常实现或产生异样, 都会调用, 而且能够拿到 Exception 对象!

若 handler 胜利, 则 ex==null; 若 handler 抛出异样, ex 有值 (前提是: @ExceptionHandler 没有解决抛出的异样, 如果解决了, 就到不了 ex 这里了);

3. 过滤器

  1. 自研 filter @Component
  2. 第三方 filter Config 类: 专做注册类
@Configuration
public class WebConfig{
    @Bean
    public FilterRegisterationBean timeFilter(){
        // 1. filter 注册 bean
        FilterRegistrationBean filterBean = new FilterRegistrationBean();
        
        // 2. 三方 filter
        TimeFilter timeFilter = new TimeFilter(); 
        filterBean.setFilter(timeFilter); // 过滤器对象
        List<String> urls = new ArrayList<>();
        urls.add("/*");
        
        // 3. 过滤器模式
        filterBean.setUrlPatterns(urls);
        
        return filterBean;
    }
}

4. 过滤器 / 拦截器 / 切面类比拟

4.1 Filter

1. 能够拿到原始的 Request 和 Response 信息;
2. 拿不到拦挡的办法信息 (拦挡的类名 / 办法名)

4.2 Interceptor

1. 能够拿到原始的 Request 和 Response 信息;
2. 能够拿到拦挡的控制器的办法信息 (拦挡的类名 / 办法名);
3. 拿不到拦挡的控制器的办法参数信息;

4.3 Aspect

1. 拿不到 Request 和 Response 信息;
2. 能够拿到拦挡的拦挡的控制器的类和办法信息;
3. 能够拿到拦挡的控制器的办法参数信息;

4.4 拦截器 vs 过滤器其余方面比拟

1. Filter 申明 @Component 就会起作用; Interceptor 须要再 registry;
2. Filter 先于 Interceptor 执行;
3. Filter 是 Servlet 标准, 拿不到 Spring 的控制器的类和办法! 拦截器是 Spring 的, 它能够拿到所拦挡控制器的类和办法;

正文完
 0