记录请求的耗时(拦截器、过滤器、aspect)
记录请求的耗时(拦截器、过滤器、aspect)
文章前言
记录控制器请求的耗时处理通常有三种实现方式,分别是:过滤器、拦截器、aspect;下文将逐一实现。
1、Filter 过滤器
1.1、方法说明
- destory:销毁
- doFilter:处理过滤器逻辑
- init:filter 初始化时调用
1.2、代码部分
@Component //表明作为spring的一个bean public class TimeFilter implements Filter {@Overridepublic void destroy() {System.out.println("time filter destroy");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println("time filter start");long start = new Date().getTime();//过滤器主要逻辑,整个处理流程 chain.doFilter(request, response);System.out.println("time filter 耗时:"+ (new Date().getTime() - start));System.out.println("time filter finish");}@Overridepublic void init(FilterConfig arg0) throws ServletException {System.out.println("time filter init");}}
1.3、补充说明
2、Interceptor 拦截器
2.1、方法说明
- preHandle:请求方法之前被调用;
- postHandle:控制器处理方法之后会被调用,前提是没有抛出异常,抛出异常不会调用;
- afterCompletion:请求方法之后被调用,该方法总会被调用,如果出现了异常,将被封装到Exception对象中。
2.2、代码部分
@Component public class TimeInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("preHandle");System.out.println(((HandlerMethod)handler).getBean().getClass().getName());System.out.println(((HandlerMethod)handler).getMethod().getName());request.setAttribute("startTime", new Date().getTime());return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println("postHandle");Long start = (Long) request.getAttribute("startTime");System.out.println("time interceptor 耗时:"+ (new Date().getTime() - start));}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {System.out.println("afterCompletion");Long start = (Long) request.getAttribute("startTime");System.out.println("time interceptor 耗时:"+ (new Date().getTime() - start));System.out.println("ex is "+ex);}}
2.3、补充部分
2.4、注意部分
@Configuration public class WebConfig extends WebMvcConfigurerAdapter {@SuppressWarnings("unused")@Autowiredprivate TimeInterceptor timeInterceptor;// 拦截器的一个注册器 @Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(timeInterceptor);}}
2.5、继续补充
3、Aspect
3.1、通知(Adivce)
通知分为五种类型: Before(前置通知):在目标方法被调用之前调用通知功能 After(后置通知):在目标方法完成后调用通知,无论方法是否执行成功,不会关心方法的输出是什么 After-returning(返回通知):在目标方法成功执行之后调用通知 After-throwing(异常通知):在目标方法抛出异常后调用通知 Around(通知环绕):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为
3.2、连接点(Join point)
连接点是一个应用执行过程中能够插入一个切面的点。 比如:方法调用、方法执行、字段设置/获取、异常处理执行、类初始化、甚至是for循环中的某个点。 理论上, 程序执行过程中的任何时点都可以作为作为织入点, 而所有这些执行时点都是Joint point, 但 Spring AOP 目前仅支持方法执行 (method execution)。
3.3、切点(Pointcut)
通知(advice)定义了切面何时,那么切点就是定义切面“何处” 描述某一类 Joint points, 比如定义了很多 Joint point, 对于 Spring AOP 来说就是匹配哪些方法的执行。
3.4、切面(Aspect)
切面是切点和通知的结合。通知和切点共同定义了关于切面的全部内容 —— 它是什么时候,在何时和何处完成功能。
3.5、引入(Introduction)
引用允许我们向现有的类添加新的方法或者属性
3.6、织入(Weaving)
组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。 Spring和其他纯Java AOP框架一样,在运行时完成织入。
@Aspect @Component public class TimeAspect {@Around("execution(* club.sscai.security.web.controller.UserController.*(..))")public Object handleTime(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {System.out.println("time aspect is start.");for (Object object : proceedingJoinPoint.getArgs()) {System.out.println(object);}long startTime = System.currentTimeMillis();Object obj = proceedingJoinPoint.proceed();System.out.println("time aspect 耗时:" + (System.currentTimeMillis() - startTime));System.out.println("time aspect finish.");return obj;} }
记录请求的耗时(拦截器、过滤器、aspect)相关推荐
- SpringBoot中AOP实现落地——Filter(过滤器)、Intercepter(拦截器)、Aspect(Spring AOP)
文章目录 一.一切要从Servlet说起 1.1什么是Servlet 1.2为什么需要Servlet 1.3Servlet如何响应用户请求 1.4Servlet与Tomcat处理请求的流程 1.5Se ...
- java 判断请求为 ajax请求_Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求...
Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求 java 判断请求是不是ajax请求,Java判断是否为ajax请求 >>>>>> ...
- Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求
Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求 Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求 java 判断 ...
- java过滤器原理,拦截器,过滤器,监听器 区别及执行顺序
本文引用该作者(花开半夏)著作内容,觉得写的很好,记录一下便于回看防止失踪,更多详情请查看原作者. 同时还搜罗了其他便于理解的博文感兴趣的可以看看促进理解 拦截器,过滤器,监听器执行顺序(被拦截个人过 ...
- VUE全局导航守卫、 请求、响应拦截器 的设置
文件设置参考地址:https://gitee.com/wang_yu5201314/headlines__news/tree/master/%E9%A1%B9%E7%9B%AE%E6%BA%90%E7 ...
- spring拦截器-过滤器的区别
1. 理解 拦截器 :是在面向切面编程的时候,在你的 service 或者一个方法前调用一个方法,或者在方法后调用一个方法:比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业 ...
- SpringBoot 拦截器 过滤器
1.过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的.请求结束返回也是,是在servlet处理完后,返回给前端之前. 2.拦截器可以获取IOC容器中的各 ...
- 拦截器获取请求参数post_SpringBoot拦截器如何获取http请求参数
1.1.获取http请求参数是一种刚需 我想有的小伙伴肯定有过获取http请求的需要,比如想 前置获取参数,统计请求数据 做服务的接口签名校验 敏感接口监控日志 敏感接口防重复提交 等等各式各样的场景 ...
- Spring MVC中的拦截器/过滤器HandlerInterceptorAdapter的使用
转载自 https://www.cnblogs.com/EasonJim/p/7704740.html 一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的 而在Spring中,基于Filt ...
最新文章
- 从 PoS 进化 SPoS:无能耗共识机制
- Scrum敏捷开发看板工具分享
- Hibernate.Annotation注解
- 一个漂亮的电子钟,纪念我们逝去的青春(含软硬件资料)
- 1.12_count_sort_计数排序
- 阿里架构师教你处理高并发:2种方法,解决Redis和Mysql一致性
- 阿里云免费试用之体验——阿里云serverECS试用心得
- linux多线程select定时器,linux使用select实现精肯定时器详解
- 极客大学架构师训练营 大数据 三驾马车 GFS、MapReduce、BigTable,Hadoop HDFS 第23课 听课总结
- 使用python Selenium实现智慧树界面化自动刷网课 chromehandless实现智慧树无界面化自动刷网课
- VmPlayer上设置主机和windows虚拟机文件夹共享
- 谷歌地球看不了街景_谷歌街景车意外拍到的沙雕动物们……也是意想不到的快乐源泉啊!...
- 阿里云ASR 语音识别接口调用
- 仰望星空不如脚踏实地
- ArcGIS Engine二次开发常用接口及其使用方法(一)
- 小学计算机课打字游戏,小学信息技术打字游戏教案
- http协议、URL、GET/POST请求报文及响应报文
- 1012-RPA与目标使用者
- 2017 ACM Arabella Collegiate Programming Contest G. Snake Rana GYM101350G
- 28推论坛邀请注册攻略
热门文章
- [vue] 怎么缓存当前打开的路由组件,缓存后想更新当前组件怎么办呢?
- [css] 举例说明时间、频率、角度、弧度、百分度的单位分别是哪些?
- [css] 如何使用css显示a链接的url?
- [vue-cli]不用vue-cli,你自己有搭建过vue的开发环境吗?流程是什么?
- 前端学习(2675):vue3.0学习建议
- 前端学习(2667):退出编辑状态
- 前端学习(2620):新增品牌
- 前端学习(2185):tabberitem和路由结果
- 前端学习(1991)vue之电商管理系统电商系统之实现商品的分页功能
- 前端学习(1748):前端调试值之console的一些设置