千家信息网

如何使用Spring的拦截器监测每个Controller或方法的执行时长

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要讲解了"如何使用Spring的拦截器监测每个Controller或方法的执行时长",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何使用Sp
千家信息网最后更新 2026年11月02日如何使用Spring的拦截器监测每个Controller或方法的执行时长

这篇文章主要讲解了"如何使用Spring的拦截器监测每个Controller或方法的执行时长",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何使用Spring的拦截器监测每个Controller或方法的执行时长"吧!

目录
  • Spring拦截器监测每个Controller或方法的执行时长

    • 首先写一个类(TestInterceptor)

    • 接下来是spring配置文件

  • 拦截器三个方法的执行时机

    • 拦截器三个方法分别是

Spring拦截器监测每个Controller或方法的执行时长

首先写一个类(TestInterceptor)

让他继承HandlerInterceptorAdapter,并重写其中的三个方法,例如:

package com.wechat.test;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import java.util.Calendar;import java.util.Date;/** * Created by lenovo on 2017/3/14. */public class TestInterceptor extends HandlerInterceptorAdapter {    private long time;    private int openingTime;    private int closingTime;    private String mappingURL;//利用正则映射到需要拦截的路径    public void setOpeningTime(int openingTime) {        this.openingTime = openingTime;    }    public void setClosingTime(int closingTime) {        this.closingTime = closingTime;    }    public void setMappingURL(String mappingURL) {        this.mappingURL = mappingURL;    }    /**     * 1.进入Controller方法之前执行     * @param request     * @param response     * @param handler     * @return 返回值为true时可继续执行Controller,preHandle()和afterCompletion(),为false时停止执行任何方法。     * @throws Exception     */    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        time = System.currentTimeMillis();        String url=request.getRequestURL().toString();        if(mappingURL==null || url.matches(mappingURL)){            Calendar c=Calendar.getInstance();            c.setTime(new Date());            int now=c.get(Calendar.HOUR_OF_DAY);            if(nowclosingTime){                request.setAttribute("msg", "注册开放时间:" + openingTime + ":00-" + closingTime + ":00");//                request.getRequestDispatcher("/msg.jsp").forward(request, response);                return false;            }            return true;        }        return true;    }    /**     * 2.Controller方法执行完毕但是未进行视图渲染时执行     * @param request     * @param response     * @param handler     * @param modelAndView     * @throws Exception     */    @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {        super.postHandle(request, response, handler, modelAndView);    }    /**     * 3.视图渲染完成(整个请求结束)执行     * @param request     * @param response     * @param handler     * @param ex     * @throws Exception     */    @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {        System.out.println("请求处理完成啦!用时:"+(System.currentTimeMillis() - time)+"ms");        super.afterCompletion(request, response, handler, ex);    }}

接下来是spring配置文件

                                                                  

拦截器三个方法的执行时机

拦截器三个方法分别是

1. preHandle

预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如具体的Controller实现);

返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;

2. postHandle

后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。

3. afterCompletion

整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion.

首先用户请求到达前端控制器 DispatcherServlet,前端控制器找到处理器映射器,根据请求的方法找到对应的处理器handler,生成拦截器和handler执行顺序的执行链,交给DispatcherServlet,

dispatcherServlet找到对应的处理器适配器进行处理.

prehandler在请求处理之前执行.该方法的返回值是布尔值 Boolean 类型的,当它返回为 false 时,表示请求结束,后续的 Interceptor 和 Controller 都不会再执行;当返回值为 true 时,就会继续调用下一个 Interceptor 的 preHandle 方法,如果已经是最后一个 Interceptor 的时候,就会是调用当前请求的 Controller 中的方法。

postHandler 方法在当前请求进行处理之后,也就是在 Controller 中的方法调用之后执行,但是它会在 DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对 Controller 处理之后的 ModelAndView 对象进行操作。

afterCompletion该方法将在整个请求结束之后,也就是在 DispatcherServlet 渲染了对应的视图之后执行,这个方法的主要作用是用于进行资源清理的工作。像异常处理资源释放会放在这一步.

多个拦截器的执行顺序是: 拦截器A的preHandler-->拦截器B的preHandler-->B的postHandler-->A的postHandler-->B的afterCompletion-->A的afterCompletion

感谢各位的阅读,以上就是"如何使用Spring的拦截器监测每个Controller或方法的执行时长"的内容了,经过本文的学习后,相信大家对如何使用Spring的拦截器监测每个Controller或方法的执行时长这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

方法 处理 拦截器 处理器 视图 时长 监测 三个 时间 资源 学习 接下来 也就是 内容 前端 对象 控制器 文件 时机 模型 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技海报 深圳市人人互联网科技有限公司 工业互联网科技新基建 科技制造互联网公司 成都互联网科技公司 汇久创客互联网科技 齐家互联网科技有限公司 互联网科技公司介绍 科技大学互联网专业好不好 青岛中康互联网医疗科技有限公司 福建科技产业互联网发展 电子科技大学互联网创业大赛 国大互联网教育科技有限公司薪资 梅州GM互联网络科技有限公司 江苏互联网智能科技软件 科技互联网行业投资研究 江苏互联网智能科技产品出厂价 互联网科技机房 互联网领先科技活动 杭州融税互联网科技有限公司 互联网通讯科技 顺玮阁互联网科技 深圳互联网科技怎么样 剑昆互联网络科技有限公司临桂 湖南一路畅行互联网科技 互联网科技和信息 互联网金融科技名词解释 城市宝互联网科技有限公司 互联网科技对化妆品行业 高科技和互联网的现代国家
0