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

@Overridepublic boolean preHandle    (HttpServletRequest request,      HttpServletResponse response,      Object handler // Object-> HandlerMethod    ) throws Exception {        return true;}
Controller的办法被解决之前, preHandler会被调用;

2.2 postHandler

@Overridepublic 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

@Overridepublic 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类: 专做注册类
@Configurationpublic 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的, 它能够拿到所拦挡控制器的类和办法;