package com.common.aspect; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializeFilter; import com.alibaba.fastjson.serializer.SimplePropertyPreFilter; import com.alibaba.fastjson.serializer.ValueFilter; import com.common.security.utils.IpUtil; import com.deloitte.system.model.SysLog; import com.deloitte.system.request.FileRequest; import eu.bitwalker.useragentutils.UserAgent; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.core.annotation.Order; 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.servlet.http.HttpServletRequest; import java.io.BufferedReader; import java.io.IOException; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.Objects; /** * @author 廖振钦 * @date 2022-01-14 */ @Slf4j @Aspect @Component @Order(1) public class LogAspect { @Pointcut("execution(* com..controller..*.*(..)) && (@annotation(org.springframework.web.bind.annotation.RequestMapping)" + "|| @annotation(org.springframework.web.bind.annotation.GetMapping)" + "|| @annotation(org.springframework.web.bind.annotation.PostMapping)" + "|| @annotation(org.springframework.web.bind.annotation.DeleteMapping)" + "|| @annotation(org.springframework.web.bind.annotation.PatchMapping))"+ "&& !@annotation(com.common.annotation.NoLog)") public void controllerMethodPointcut() { } @Before("controllerMethodPointcut()") public void doBefore(JoinPoint point) { try { handleLog(point); } catch (Throwable e) { log.error("LogAspect>>>>>>>>", e); throw e; } } protected void handleLog(JoinPoint point) { HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest(); String uri = request.getRequestURI(); UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("user-agent")); String clientType = userAgent.getOperatingSystem().getDeviceType().toString(); log.info("clientType = " + clientType); //客户端类型 手机、电脑、平板 String os = userAgent.getOperatingSystem().getName(); log.info("os = " + os); //操作系统类型 String ip = IpUtil.getIpAddr(request); log.info("ip = " + ip); //请求ip String browser = userAgent.getBrowser().toString(); log.info("browser = " + browser); //浏览器类型 // log.info(Thread.currentThread().getName()+",requestparam="+ JSONObject.toJSONString(point.getArgs())); SysLog sysLog = new SysLog(); if(uri.endsWith("/file/upload")){ FileRequest param=(FileRequest)point.getArgs()[0]; JSONObject jsonObject=new JSONObject(); jsonObject.put("fileName",param.getFileName()); jsonObject.put("size",param.getSize()); sysLog.ip(ip).retContent("request:" + jsonObject).uri(uri); }else if(uri.endsWith("/file/batchupload")){ List param=(List)point.getArgs()[0]; JSONArray jsonArray=new JSONArray(); if(CollectionUtil.isNotEmpty(param)) { for (int i = 0; i < param.size(); i++) { JSONObject jsonObject = new JSONObject(); jsonObject.put("fileName", param.get(i).getFileName()); jsonObject.put("size", param.get(i).getSize()); jsonArray.add(jsonObject); } sysLog.ip(ip).retContent("request:" + jsonArray).uri(uri); } }else{ SerializeFilter filter=new ValueFilter() { @Override public Object process(Object o, String s, Object o1) { if(o instanceof MultipartFile){ return null; } if(o1 instanceof MultipartFile){ return null; } return o1; } }; sysLog.ip(ip).retContent("request:" + JSONObject.toJSONString(point.getArgs(),filter)).uri(uri); } sysLog.save(); } }