LogAspect.java 8.33 KB
Newer Older
tangzhaoqian committed
1 2 3 4 5 6 7 8 9 10 11 12
package cn.timer.api.aspect;

import java.lang.reflect.Method;
import java.util.Date;
import java.util.Map;
import java.util.TimerTask;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

陶湘宇 committed
13
import cn.timer.api.utils.redis.RedisUtil;
tangzhaoqian committed
14 15 16 17 18 19 20 21 22 23 24 25 26 27
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.HandlerMapping;
import com.alibaba.fastjson.JSON;

28
import cn.hutool.core.util.ObjectUtil;
tangzhaoqian committed
29 30 31 32 33
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.timer.api.aspect.lang.annotation.Log;
import cn.timer.api.aspect.lang.enums.BusinessStatus;
tangzhaoqian committed
34
import cn.timer.api.aspect.lang.enums.BusinessType;
tangzhaoqian committed
35 36 37
import cn.timer.api.bean.qyzx.QyzxEmpLogin;
import cn.timer.api.bean.qyzx.QyzxOperLog;
import cn.timer.api.config.enums.HttpMethod;
38
import cn.timer.api.dao.yggl.YgglMainEmpMapper;
tangzhaoqian committed
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
import cn.timer.api.manager.AsyncManager;
import cn.timer.api.manager.factory.AsyncFactory;
import cn.timer.api.utils.ServletUtils;
import cn.timer.api.utils.UserIp;

/**
 * 操作日志记录处理
 * 
 * @author Tang
 */
@Aspect
@Component
public class LogAspect
{
    private static final Logger log = LoggerFactory.getLogger(LogAspect.class);

    @Resource
	private HttpSession session;
陶湘宇 committed
57 58
    @Resource
	private RedisUtil redisUtil;
tangzhaoqian committed
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
    
    // 配置织入点
    @Pointcut("@annotation(cn.timer.api.aspect.lang.annotation.Log)")
    public void logPointCut()
    {
    }

    /**
     * 处理完请求后执行
     *
     * @param joinPoint 切点
     */
    @AfterReturning(pointcut = "logPointCut()", returning = "jsonResult")
    public void doAfterReturning(JoinPoint joinPoint, Object jsonResult)
    {
        handleLog(joinPoint, null, jsonResult);
    }

    /**
     * 拦截异常操作
     * 
     * @param joinPoint 切点
     * @param e 异常
     */
    @AfterThrowing(value = "logPointCut()", throwing = "e")
    public void doAfterThrowing(JoinPoint joinPoint, Exception e)
    {
        handleLog(joinPoint, e, null);
    }

    protected void handleLog(final JoinPoint joinPoint, final Exception e, Object jsonResult)
    {
        try
        {
            // 获得注解
            Log controllerLog = getAnnotationLog(joinPoint);
            if (controllerLog == null)
            {
                return;
            }

            // 获取当前的用户
//            LoginUser loginUser = SpringUtils.getBean(TokenService.class).getLoginUser(ServletUtils.getRequest());
陶湘宇 committed
102
            QyzxEmpLogin eld = (QyzxEmpLogin)redisUtil.getAttribute(session.getId(),"ui");
tangzhaoqian committed
103
            
104 105 106 107 108 109 110 111 112 113 114
//            if (eld == null && controllerLog.businessType() == BusinessType.SEND_CODE) {
//            	Object[] objs = joinPoint.getArgs();
//            	if (objs != null && objs.length >= 1) {
//            		JSONObject jsonObject = JSONUtil.parseObj(objs[0]);
//            		
//            		String phone = jsonObject.getStr("phone");
//            		if (StrUtil.isNotBlank(phone)) {
//					}
//            		System.out.println(JSONUtil.parseObj(jsonObject));
//				}
//			}
tangzhaoqian committed
115 116 117
            
            
            
tangzhaoqian committed
118 119 120
            // *========数据库日志=========*//
            QyzxOperLog operLog = new QyzxOperLog();
            
tangzhaoqian committed
121
            
tangzhaoqian committed
122 123 124 125 126 127 128 129 130 131
            // 请求的地址
            String ip = UserIp.getIpAddr(ServletUtils.getRequest());
            operLog.setOperIp(ip);
            // 返回参数
            String jsonResultStr = JSON.toJSONString(jsonResult);
            operLog.setJsonResult(jsonResultStr.length() <= 10000 ? jsonResultStr : "");

            operLog.setOperUrl(ServletUtils.getRequest().getRequestURI());
            if (eld != null)
            {
tangzhaoqian committed
132 133
            	operLog.setOrgCode(eld.getOrgId());
                operLog.setEmpNum(eld.getId());
134
                operLog.setOperName(eld.getYgglMainEmp().getName());
tangzhaoqian committed
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256
            }

            if (e != null)
            {
                operLog.setStatus(BusinessStatus.FAIL.ordinal());
                operLog.setErrorMsg(StrUtil.sub(e.getMessage(), 0, 2000));
            }else{
            	operLog.setStatus(BusinessStatus.SUCCESS.ordinal());
			}
            // 设置方法名称
            String className = joinPoint.getTarget().getClass().getName();
            String methodName = joinPoint.getSignature().getName();
            operLog.setMethod(className + "." + methodName + "()");
            // 设置请求方式
            operLog.setRequestMethod(ServletUtils.getRequest().getMethod());
            operLog.setOperTime(new Date());
            // 处理设置注解上的参数
            getControllerMethodDescription(joinPoint, controllerLog, operLog);
            // 保存数据库
        	AsyncManager.me().execute(AsyncFactory.recordOper(operLog));
        }
        catch (Exception exp)
        {
            // 记录本地异常日志
            log.error("==前置通知异常==");
            log.error("异常信息:{}", exp.getMessage());
            exp.printStackTrace();
        }
    }

    /**
     * 获取注解中对方法的描述信息 用于Controller层注解
     * 
     * @param log 日志
     * @param operLog 操作日志
     * @throws Exception
     */
    public void getControllerMethodDescription(JoinPoint joinPoint, Log log, QyzxOperLog operLog) throws Exception
    {
        // 设置action动作
        operLog.setBusinessType(log.businessType().ordinal());
        // 设置标题
        operLog.setTitle(log.title());
        // 设置操作人类别
        operLog.setOperatorType(log.operatorType().ordinal());
        // 是否需要保存request,参数和值
        if (log.isSaveRequestData())
        {
            // 获取参数的信息,传入到数据库中。
            setRequestValue(joinPoint, operLog);
        }
    }

    /**
     * 获取请求的参数,放到log中
     * 
     * @param operLog 操作日志
     * @throws Exception 异常
     */
    private void setRequestValue(JoinPoint joinPoint, QyzxOperLog operLog) throws Exception
    {
        String requestMethod = operLog.getRequestMethod();
        if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod))
        {
//        	JSONObject jsonObj = JSONUtil.parseObj(joinPoint.getArgs());
            String params = argsArrayToString(joinPoint.getArgs());
            operLog.setOperParam(StrUtil.sub(params, 0, 10000));
        }
        else
        {
            Map<?, ?> paramsMap = (Map<?, ?>) ServletUtils.getRequest().getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
            operLog.setOperParam(StrUtil.sub(paramsMap.toString(), 0, 10000));
        }
    }

    /**
     * 是否存在注解,如果存在就获取
     */
    private Log getAnnotationLog(JoinPoint joinPoint) throws Exception
    {
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();

        if (method != null)
        {
            return method.getAnnotation(Log.class);
        }
        return null;
    }

    /**
     * 参数拼装
     */
    private String argsArrayToString(Object[] paramsArray)
    {
        String params = "";
        if (paramsArray != null && paramsArray.length > 0)
        {
            for (int i = 0; i < paramsArray.length; i++)
            {
                if (!isFilterObject(paramsArray[i]))
                {
                    Object jsonObj = JSON.toJSON(paramsArray[i]);
                    params += jsonObj.toString() + " ";
                }
            }
        }
        return params.trim();
    }

    /**
     * 判断是否需要过滤的对象。
     * 
     * @param o 对象信息。
     * @return 如果是需要过滤的对象,则返回true;否则返回false。
     */
    public boolean isFilterObject(final Object o)
    {
        return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse;
    }
}