| | |
| | | package com.zy.asrs.wms.common.aspect; |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.zy.asrs.common.utils.IpTools; |
| | | import com.zy.asrs.framework.common.Cools; |
| | | import com.zy.asrs.wms.common.annotation.OperationLog; |
| | | import com.zy.asrs.wms.system.entity.OperationRecord; |
| | | import com.zy.asrs.wms.system.entity.User; |
| | | import com.zy.asrs.wms.system.service.OperationRecordService; |
| | | import com.zy.asrs.wms.utils.Utils; |
| | | import org.aspectj.lang.JoinPoint; |
| | | import org.aspectj.lang.annotation.*; |
| | | import org.aspectj.lang.reflect.MethodSignature; |
| | | import org.springframework.security.core.Authentication; |
| | | import org.springframework.security.core.context.SecurityContextHolder; |
| | | import org.springframework.stereotype.Component; |
| | | import org.springframework.web.context.request.RequestContextHolder; |
| | | import org.springframework.web.context.request.ServletRequestAttributes; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.lang.reflect.Method; |
| | | import java.util.Collections; |
| | | import java.util.Date; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * 操作日志记录 |
| | | * |
| | | * @author vincent |
| | | * @since 2020-03-21 16:58:16:05 |
| | | */ |
| | | @Aspect |
| | | @Component |
| | | public class OperationLogAspect { |
| | | |
| | | @Resource |
| | | private OperationRecordService operationRecordService; |
| | | // 参数、返回结果、错误信息等最大保存长度 |
| | | private static final int MAX_LENGTH = 1000; |
| | | // 用于记录请求耗时 |
| | | private final ThreadLocal<Long> startTime = new ThreadLocal<>(); |
| | | |
| | | @Pointcut("@annotation(com.zy.asrs.wms.common.annotation.OperationLog)") |
| | | public void operationLog() { |
| | | } |
| | | |
| | | @Before("operationLog()") |
| | | public void doBefore(JoinPoint joinPoint) throws Throwable { |
| | | startTime.set(System.currentTimeMillis()); |
| | | } |
| | | |
| | | @AfterReturning(pointcut = "operationLog()", returning = "result") |
| | | public void doAfterReturning(JoinPoint joinPoint, Object result) { |
| | | saveLog(joinPoint, result, null); |
| | | } |
| | | |
| | | @AfterThrowing(value = "operationLog()", throwing = "e") |
| | | public void doAfterThrowing(JoinPoint joinPoint, Exception e) { |
| | | saveLog(joinPoint, null, e); |
| | | } |
| | | |
| | | /** |
| | | * 保存操作记录 |
| | | */ |
| | | private void saveLog(JoinPoint joinPoint, Object result, Exception e) { |
| | | // 记录模块名、操作功能、请求方法、请求参数、返回结果 |
| | | MethodSignature signature = (MethodSignature) joinPoint.getSignature(); |
| | | Method method = signature.getMethod(); |
| | | if (null == method) { |
| | | return; |
| | | } |
| | | OperationLog ol = method.getAnnotation(OperationLog.class); |
| | | if (null == ol) { |
| | | return; |
| | | } |
| | | String desc = getDescription(method, ol); |
| | | if (Cools.isEmpty(desc)) { |
| | | return; |
| | | } |
| | | OperationRecord record = new OperationRecord(); |
| | | Long endTime = startTime.get(); |
| | | record.setCreateTime(new Date()); |
| | | // 记录操作耗时 |
| | | if (endTime != null) { |
| | | record.setSpendTime((int) (System.currentTimeMillis() - endTime)); |
| | | } |
| | | record.setTimestamp(String.valueOf(endTime)); |
| | | // 记录当前登录用户id、租户id |
| | | User user = getLoginUser(); |
| | | if (user != null) { |
| | | record.setUserId(user.getId()); |
| | | record.setHostId(user.getHostId()); |
| | | } |
| | | // 记录请求地址、请求方式、ip |
| | | ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); |
| | | HttpServletRequest request = (attributes == null ? null : attributes.getRequest()); |
| | | if (request != null) { |
| | | record.setUrl(request.getRequestURI()); |
| | | record.setClientIp(IpTools.gainRealIp(request)); |
| | | } |
| | | // 记录异常信息 |
| | | if (e != null) { |
| | | record.setResult(0); |
| | | record.setErr(Utils.sub(e.toString(), MAX_LENGTH)); |
| | | } else { |
| | | record.setResult(1); |
| | | } |
| | | // 记录操作功能 |
| | | record.setNamespace(desc); |
| | | // 记录备注 |
| | | if (!Cools.isEmpty(ol.comments())) { |
| | | record.setMemo(ol.comments()); |
| | | } |
| | | // 记录请求参数 |
| | | if (ol.param() && request != null) { |
| | | record.setRequest(Utils.sub(getParams(joinPoint, request), MAX_LENGTH)); |
| | | } |
| | | // 记录请求结果 |
| | | if (ol.result() && result != null) { |
| | | record.setResponse(Utils.sub(JSON.toJSONString(result), MAX_LENGTH)); |
| | | } |
| | | operationRecordService.saveAsync(record); |
| | | } |
| | | |
| | | /** |
| | | * 获取当前登录用户 |
| | | */ |
| | | private User getLoginUser() { |
| | | Authentication subject = SecurityContextHolder.getContext().getAuthentication(); |
| | | if (subject != null) { |
| | | Object object = subject.getPrincipal(); |
| | | if (object instanceof User) { |
| | | return (User) object; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * 获取请求参数 |
| | | * |
| | | * @param joinPoint JoinPoint |
| | | * @param request HttpServletRequest |
| | | * @return String |
| | | */ |
| | | private String getParams(JoinPoint joinPoint, HttpServletRequest request) { |
| | | String params; |
| | | |
| | | Map<String, String> paramsMap = new HashMap<>(); |
| | | |
| | | Map<String, String[]> map = Collections.unmodifiableMap(request.getParameterMap()); |
| | | for (Map.Entry<String, String[]> entry : map.entrySet()) { |
| | | paramsMap.put(entry.getKey(), Utils.join(entry.getValue(), ",")); |
| | | } |
| | | |
| | | if (paramsMap.keySet().size() > 0) { |
| | | params = JSON.toJSONString(paramsMap); |
| | | } else { |
| | | StringBuilder sb = new StringBuilder(); |
| | | for (Object arg : joinPoint.getArgs()) { |
| | | if (null == arg |
| | | || arg instanceof MultipartFile |
| | | || arg instanceof HttpServletRequest |
| | | || arg instanceof HttpServletResponse) { |
| | | continue; |
| | | } |
| | | sb.append(JSON.toJSONString(arg)).append(" "); |
| | | } |
| | | params = sb.toString(); |
| | | } |
| | | return params; |
| | | } |
| | | |
| | | /** |
| | | * 获取操作功能 |
| | | * |
| | | * @param method Method |
| | | * @param ol OperationLog |
| | | * @return String |
| | | */ |
| | | private String getDescription(Method method, OperationLog ol) { |
| | | if (!Cools.isEmpty(ol.value())) { |
| | | return ol.value(); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
| | | package com.zy.asrs.wms.common.aspect;
|
| | |
|
| | | import com.alibaba.fastjson.JSON;
|
| | | import com.zy.asrs.common.utils.IpTools;
|
| | | import com.zy.asrs.framework.common.Cools;
|
| | | import com.zy.asrs.wms.common.annotation.OperationLog;
|
| | | import com.zy.asrs.wms.system.entity.OperationRecord;
|
| | | import com.zy.asrs.wms.system.entity.User;
|
| | | import com.zy.asrs.wms.system.service.OperationRecordService;
|
| | | import com.zy.asrs.wms.utils.Utils;
|
| | | import org.aspectj.lang.JoinPoint;
|
| | | import org.aspectj.lang.annotation.*;
|
| | | import org.aspectj.lang.reflect.MethodSignature;
|
| | | import org.springframework.security.core.Authentication;
|
| | | import org.springframework.security.core.context.SecurityContextHolder;
|
| | | import org.springframework.stereotype.Component;
|
| | | import org.springframework.web.context.request.RequestContextHolder;
|
| | | import org.springframework.web.context.request.ServletRequestAttributes;
|
| | | import org.springframework.web.multipart.MultipartFile;
|
| | |
|
| | | import javax.annotation.Resource;
|
| | | import javax.servlet.http.HttpServletRequest;
|
| | | import javax.servlet.http.HttpServletResponse;
|
| | | import java.lang.reflect.Method;
|
| | | import java.util.Collections;
|
| | | import java.util.Date;
|
| | | import java.util.HashMap;
|
| | | import java.util.Map;
|
| | |
|
| | | /**
|
| | | * 操作日志记录
|
| | | *
|
| | | * @author vincent
|
| | | * @since 2020-03-21 16:58:16:05
|
| | | */
|
| | | @Aspect
|
| | | @Component
|
| | | public class OperationLogAspect {
|
| | |
|
| | | @Resource
|
| | | private OperationRecordService operationRecordService;
|
| | | // 参数、返回结果、错误信息等最大保存长度
|
| | | private static final int MAX_LENGTH = 1000;
|
| | | // 用于记录请求耗时
|
| | | private final ThreadLocal<Long> startTime = new ThreadLocal<>();
|
| | |
|
| | | @Pointcut("@annotation(com.zy.asrs.wms.common.annotation.OperationLog)")
|
| | | public void operationLog() {
|
| | | }
|
| | |
|
| | | @Before("operationLog()")
|
| | | public void doBefore(JoinPoint joinPoint) throws Throwable {
|
| | | startTime.set(System.currentTimeMillis());
|
| | | }
|
| | |
|
| | | @AfterReturning(pointcut = "operationLog()", returning = "result")
|
| | | public void doAfterReturning(JoinPoint joinPoint, Object result) {
|
| | | saveLog(joinPoint, result, null);
|
| | | }
|
| | |
|
| | | @AfterThrowing(value = "operationLog()", throwing = "e")
|
| | | public void doAfterThrowing(JoinPoint joinPoint, Exception e) {
|
| | | saveLog(joinPoint, null, e);
|
| | | }
|
| | |
|
| | | /**
|
| | | * 保存操作记录
|
| | | */
|
| | | private void saveLog(JoinPoint joinPoint, Object result, Exception e) {
|
| | | // 记录模块名、操作功能、请求方法、请求参数、返回结果
|
| | | MethodSignature signature = (MethodSignature) joinPoint.getSignature();
|
| | | Method method = signature.getMethod();
|
| | | if (null == method) {
|
| | | return;
|
| | | }
|
| | | OperationLog ol = method.getAnnotation(OperationLog.class);
|
| | | if (null == ol) {
|
| | | return;
|
| | | }
|
| | | String desc = getDescription(method, ol);
|
| | | if (Cools.isEmpty(desc)) {
|
| | | return;
|
| | | }
|
| | | OperationRecord record = new OperationRecord();
|
| | | Long endTime = startTime.get();
|
| | | record.setCreateTime(new Date());
|
| | | // 记录操作耗时
|
| | | if (endTime != null) {
|
| | | record.setSpendTime((int) (System.currentTimeMillis() - endTime));
|
| | | }
|
| | | record.setTimestamp(String.valueOf(endTime));
|
| | | // 记录当前登录用户id、租户id
|
| | | User user = getLoginUser();
|
| | | if (user != null) {
|
| | | record.setUserId(user.getId());
|
| | | record.setHostId(user.getHostId());
|
| | | }
|
| | | // 记录请求地址、请求方式、ip
|
| | | ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
|
| | | HttpServletRequest request = (attributes == null ? null : attributes.getRequest());
|
| | | if (request != null) {
|
| | | record.setUrl(request.getRequestURI());
|
| | | record.setClientIp(IpTools.gainRealIp(request));
|
| | | }
|
| | | // 记录异常信息
|
| | | if (e != null) {
|
| | | record.setResult(0);
|
| | | record.setErr(Utils.sub(e.toString(), MAX_LENGTH));
|
| | | } else {
|
| | | record.setResult(1);
|
| | | }
|
| | | // 记录操作功能
|
| | | record.setNamespace(desc);
|
| | | // 记录备注
|
| | | if (!Cools.isEmpty(ol.comments())) {
|
| | | record.setMemo(ol.comments());
|
| | | }
|
| | | // 记录请求参数
|
| | | if (ol.param() && request != null) {
|
| | | record.setRequest(Utils.sub(getParams(joinPoint, request), MAX_LENGTH));
|
| | | }
|
| | | // 记录请求结果
|
| | | if (ol.result() && result != null) {
|
| | | record.setResponse(Utils.sub(JSON.toJSONString(result), MAX_LENGTH));
|
| | | }
|
| | | operationRecordService.saveAsync(record);
|
| | | }
|
| | |
|
| | | /**
|
| | | * 获取当前登录用户
|
| | | */
|
| | | private User getLoginUser() {
|
| | | Authentication subject = SecurityContextHolder.getContext().getAuthentication();
|
| | | if (subject != null) {
|
| | | Object object = subject.getPrincipal();
|
| | | if (object instanceof User) {
|
| | | return (User) object;
|
| | | }
|
| | | }
|
| | | return null;
|
| | | }
|
| | |
|
| | | /**
|
| | | * 获取请求参数
|
| | | *
|
| | | * @param joinPoint JoinPoint
|
| | | * @param request HttpServletRequest
|
| | | * @return String
|
| | | */
|
| | | private String getParams(JoinPoint joinPoint, HttpServletRequest request) {
|
| | | String params;
|
| | |
|
| | | Map<String, String> paramsMap = new HashMap<>();
|
| | |
|
| | | Map<String, String[]> map = Collections.unmodifiableMap(request.getParameterMap());
|
| | | for (Map.Entry<String, String[]> entry : map.entrySet()) {
|
| | | paramsMap.put(entry.getKey(), Utils.join(entry.getValue(), ","));
|
| | | }
|
| | |
|
| | | if (paramsMap.keySet().size() > 0) {
|
| | | params = JSON.toJSONString(paramsMap);
|
| | | } else {
|
| | | StringBuilder sb = new StringBuilder();
|
| | | for (Object arg : joinPoint.getArgs()) {
|
| | | if (null == arg
|
| | | || arg instanceof MultipartFile
|
| | | || arg instanceof HttpServletRequest
|
| | | || arg instanceof HttpServletResponse) {
|
| | | continue;
|
| | | }
|
| | | sb.append(JSON.toJSONString(arg)).append(" ");
|
| | | }
|
| | | params = sb.toString();
|
| | | }
|
| | | return params;
|
| | | }
|
| | |
|
| | | /**
|
| | | * 获取操作功能
|
| | | *
|
| | | * @param method Method
|
| | | * @param ol OperationLog
|
| | | * @return String
|
| | | */
|
| | | private String getDescription(Method method, OperationLog ol) {
|
| | | if (!Cools.isEmpty(ol.value())) {
|
| | | return ol.value();
|
| | | }
|
| | | return null;
|
| | | }
|
| | |
|
| | | }
|