博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java拦截器和切面_拦截器-过滤器-切面比较
阅读量:5149 次
发布时间:2019-06-13

本文共 2148 字,大约阅读时间需要 7 分钟。

1. 切面

1.1. 切片(类) @Aspect@Aspect

UserController.*(..)

1.2. 切入点(注解) @AroundAround("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 urls = new ArrayList<>();

urls.add("/*");

// 3. 过滤器模式

filterBean.setUrlPatterns(urls);

return filterBean;

}

}

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

4.1 Filter1. 可以拿到原始的Request和Response信息;

2. 拿不到拦截的方法信息(拦截的类名/方法名)

4.2 Interceptor1. 可以拿到原始的Request和Response信息;

2. 可以拿到拦截的控制器的方法信息(拦截的类名/方法名);

3. 拿不到拦截的控制器的方法参数信息;

4.3 Aspect1. 拿不到Request和Response信息;

2. 可以拿到拦截的拦截的控制器的类和方法信息;

3. 可以拿到拦截的控制器的方法参数信息;

4.4 拦截器 vs 过滤器其他方面比较1. Filter声明@Component就会起作用; Interceptor需要再 registry;

2. Filter 先于 Interceptor执行;

3. Filter 是 Servlet规范, 拿不到 Spring的控制器的类和方法! 拦截器是Spring的, 它可以拿到所拦截控制器的类和方法;

转载地址:http://aodnv.baihongyu.com/

你可能感兴趣的文章
Git 内部原理之 Git 对象哈希
查看>>
Vue中引入TradingView制作K线图
查看>>
虚拟机CentOS设置IP
查看>>
Django之ORM多对多表创建方式,AJAX异步提交,分页器组件等
查看>>
存储过程
查看>>
C# RichTextBox 滚动条 滚动到最新行
查看>>
js编码
查看>>
BZOJ 1412 & 最小割
查看>>
【26】java的组合与继承
查看>>
web开发,我们是否应该更加Deep Inside了?
查看>>
springboot部署多个vue项目
查看>>
Pycharm Error loading package list:Status: 403错误解决方法
查看>>
steps/train_sat.sh
查看>>
TLS 1.0协议
查看>>
java递归的几种用法
查看>>
微信小程序 - 接口更新记录以及解决方案(2018/12/26)
查看>>
转:Linux设备树(Device Tree)机制
查看>>
iOS 组件化
查看>>
python安装win32api pywin32 后出现 ImportError: DLL load failed
查看>>
(转)Tomcat 8 安装和配置、优化
查看>>