zoukankan      html  css  js  c++  java
  • 日志 拦截器 工具

    /**
     * Copyright © 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
     */
    package com.thinkgem.jeesite.modules.sys.interceptor;
    
    import java.text.SimpleDateFormat;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.core.NamedThreadLocal;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import com.thinkgem.jeesite.common.service.BaseService;
    import com.thinkgem.jeesite.common.utils.DateUtils;
    import com.thinkgem.jeesite.modules.sys.utils.LogUtils;
    
    /**
     * 日志拦截器
     * @author ThinkGem
     * @version 2014-8-19
     * 
     * 在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式,
     * 1:第一种方式是要定义的Interceptor类要实现了Spring 的HandlerInterceptor 接口,
     * 2:这个类继承实现了HandlerInterceptor 接口的类
     */
    public class LogInterceptor extends BaseService implements HandlerInterceptor {
    
    	private static final ThreadLocal<Long> startTimeThreadLocal = new NamedThreadLocal<Long>("ThreadLocal StartTime");
    	
    	 /** 
         * preHandle方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用,SpringMVC中的Interceptor拦截器是链式的,可以同时存在 
         * 多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在 
         * Controller方法调用之前调用。SpringMVC的这种Interceptor链式结构也是可以进行中断的,这种中断方式是令preHandle的返 
         * 回值为false,当preHandle的返回值为false的时候整个请求就结束了。 
         */  
    	@Override
    	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 
    			Object handler) throws Exception {
    		if (logger.isDebugEnabled()){
    			long beginTime = System.currentTimeMillis();//1、开始时间  
    	        startTimeThreadLocal.set(beginTime);		//线程绑定变量(该数据只有当前请求的线程可见)  
    	        logger.debug("开始计时: {}  URI: {}", new SimpleDateFormat("hh:mm:ss.SSS").format(beginTime), request.getRequestURI());
    		}
    		return true;
    	}
    
    	 /** 
         * 这个方法只会在当前这个Interceptor的preHandle方法返回值为true的时候才会执行。postHandle是进行处理器拦截用的,它的执行时间是在处理器进行处理之 
         * 后,也就是在Controller的方法调用之后执行,但是它会在DispatcherServlet进行视图的渲染之前执行,也就是说在这个方法中你可以对ModelAndView进行操 
         * 作。这个方法的链式结构跟正常访问的方向是相反的,也就是说先声明的Interceptor拦截器该方法反而会后调用,这跟Struts2里面的拦截器的执行过程有点像, 
         * 只是Struts2里面的intercept方法中要手动的调用ActionInvocation的invoke方法,Struts2中调用ActionInvocation的invoke方法就是调用下一个Interceptor 
         * 或者是调用action,然后要在Interceptor之前调用的内容都写在调用invoke之前,要在Interceptor之后调用的内容都写在调用invoke方法之后。 
         */
    	@Override
    	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 
    			ModelAndView modelAndView) throws Exception {
    	}
    
    	  /** 
         * 该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。该方法将在整个请求完成之后,也就是DispatcherServlet渲染了视图执行, 
         * 这个方法的主要作用是用于清理资源的,当然这个方法也只能在当前这个Interceptor的preHandle方法的返回值为true时才会执行。 
         */
    	@Override
    	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
    			Object handler, Exception ex) throws Exception {
    
    		// 保存日志
    		LogUtils.saveLog(request, handler, ex, null);
    		
    		// 打印JVM信息。
    		if (logger.isDebugEnabled()){
    			long beginTime = startTimeThreadLocal.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); 
    		}
    		
    	}
    
    }
    

      

  • 相关阅读:
    mysql索引
    springboot mybatis 后台框架平台 shiro 权限 集成代码生成器
    java 企业网站源码模版 有前后台 springmvc SSM 生成静态化
    java springMVC SSM 操作日志 4级别联动 文件管理 头像编辑 shiro redis
    activiti工作流的web流程设计器整合视频教程 SSM和独立部署
    .Net Core中的ObjectPool
    文件操作、流相关类梳理
    .Net Core中的配置文件源码解析
    .Net Core中依赖注入服务使用总结
    消息中间件RabbitMQ(一)
  • 原文地址:https://www.cnblogs.com/a757956132/p/4956038.html
Copyright © 2011-2022 走看看