1

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的, 它可以拿到所拦截控制器的类和方法;

丰木
325 声望21 粉丝

遇见超乎想象的自己!