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会被调用, 但有个前提:
- preHandler返回false
- 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. 过滤器
- 自研filter @Component
- 第三方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的, 它能够拿到所拦挡控制器的类和办法;
发表回复