根据SpringMVC设置拦截器,打印内存信息,访问时间等日志信息

SpringMVC提供了一个拦截器接口供我们调用:HandlerInterceptor,这个接口有三个待实现的方法:
这里写图片描述

preHandle方法 
    进入 Handler方法之前执行
    用于身份认证、身份授权
    比如身份认证,如果认证不通过表示当前用户没有登陆,需要此方法拦截不再向下执行 
    return false表示拦截,不向下执行
    return true表示放行

postHandle方法 
    进入Handler方法之后,返回modelAndView之前执行
    应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图

afterCompletion方法 
    执行Handler完成执行此方法
    应用场景:统一异常处理,统一日志处理

自己定义一个拦截器,实现HandlerInterceptor

public class LogInterceptor implements HandlerInterceptor {

    private static final Logger logger = LoggerFactory.getLogger(LogInterceptor.class);



    private static final ThreadLocal<Long> START_TTIME_THREAD_LOCAL =
            new NamedThreadLocal<Long>("ThreadLocal StartTime");

    /**
    * 拦截的方法执行之前调用
    */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 
            Object handler) throws Exception {
        if (logger.isDebugEnabled()){
            long beginTime = System.currentTimeMillis();//1、开始时间  
            START_TTIME_THREAD_LOCAL.set(beginTime);        //线程绑定变量(该数据只有当前请求的线程可见)  
            logger.debug("开始计时: {}  URI: {}", new SimpleDateFormat("hh:mm:ss.SSS")
                .format(beginTime), request.getRequestURI());
        }
        return true;
    }

    /**
    * 拦截的方法执行过程中,返回model and view之前调用
    */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 
            ModelAndView modelAndView) throws Exception {
        if (modelAndView != null){
            logger.debug("ViewName: " + modelAndView.getViewName());
        }
    }



    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
            Object handler, Exception ex) throws Exception {

        // 打印JVM信息。
        if (logger.isDebugEnabled()){
            long beginTime = START_TTIME_THREAD_LOCAL.get();//得到线程绑定的局部变量(开始时间)  
            long endTime = System.currentTimeMillis();  //2、结束时间  
            logger.debug("计时结束:{}  耗时:{}  URI: {}  最大内存: {}m  已分配内存: {}m  已分配内存中的剩余空间: {}m  最大可用内存: {}m",
                    new SimpleDateFormat("hh:mm:ss.SSS").format(endTime), DateUtils.formatDateTime(endTime - beginTime),
                    request.getRequestURI(), Runtime.getRuntime().maxMemory()/1024/1024, Runtime.getRuntime().totalMemory()/1024/1024, Runtime.getRuntime().freeMemory()/1024/1024, 
                    (Runtime.getRuntime().maxMemory()-Runtime.getRuntime().totalMemory()+Runtime.getRuntime().freeMemory())/1024/1024); 
        }

    }
}

然后在SpringMVC配置文件进行配置:

<!--配置拦截器, 多个拦截器,顺序执行 -->
    <mvc:interceptors>
        <!-- 系统日志拦截器 -->
        <mvc:interceptor>
            <!--拦截的路径-->
            <mvc:mapping path="/**" />
            <!--排除的匹配路径-->
            <mvc:exclude-mapping path="/wxPay/*" />
            <!--自己定义的拦截器-->
            <bean class="com.zgd.shop.admin.common.interceptor.LogInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>

这样就大功告成了这里写图片描述

猜你喜欢

转载自blog.csdn.net/zzzgd_666/article/details/80328169