🚑 Hutool中JsonUtil会导致部分情况下stackoverflow,暂时先更新为使用jackson进行序列化

This commit is contained in:
b2baccline
2020-11-03 21:09:59 +08:00
parent 87f34ab953
commit 68f75e6137
6 changed files with 77 additions and 46 deletions

View File

@@ -1,7 +1,8 @@
package com.hccake.ballcat.admin.modules.log.handler; package com.hccake.ballcat.admin.modules.log.handler;
import cn.hutool.core.util.URLUtil; import cn.hutool.core.util.URLUtil;
import cn.hutool.json.JSONUtil; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.hccake.ballcat.admin.modules.log.model.entity.AdminAccessLog; import com.hccake.ballcat.admin.modules.log.model.entity.AdminAccessLog;
import com.hccake.ballcat.admin.modules.log.thread.AccessLogAdminSaveThread; import com.hccake.ballcat.admin.modules.log.thread.AccessLogAdminSaveThread;
import com.hccake.ballcat.admin.oauth.SysUserDetails; import com.hccake.ballcat.admin.oauth.SysUserDetails;
@@ -36,6 +37,8 @@ public class AdminAccessLogHandler implements AccessLogHandler<AdminAccessLog> {
private final AccessLogAdminSaveThread accessLogAdminSaveThread; private final AccessLogAdminSaveThread accessLogAdminSaveThread;
private final ObjectMapper objectMapper;
/** /**
* 生产一个日志 * 生产一个日志
* @return accessLog * @return accessLog
@@ -60,10 +63,19 @@ public class AdminAccessLogHandler implements AccessLogHandler<AdminAccessLog> {
.setUri(URLUtil.getPath(request.getRequestURI())) .setUri(URLUtil.getPath(request.getRequestURI()))
.setMatchingPattern(matchingPattern) .setMatchingPattern(matchingPattern)
.setErrorMsg(Optional.ofNullable(myThrowable).map(Throwable::getMessage).orElse("")) .setErrorMsg(Optional.ofNullable(myThrowable).map(Throwable::getMessage).orElse(""))
.setHttpStatus(response.getStatus()) .setHttpStatus(response.getStatus());
.setReqParams(JSONUtil.toJsonStr(request.getParameterMap()));
// @formatter:on // @formatter:on
// 参数获取
String params = "";
try {
params = objectMapper.writeValueAsString(request.getParameterMap());
}
catch (JsonProcessingException e) {
log.error("[prodLog],参数获取序列化异常", e);
}
adminAccessLog.setReqParams(params);
// 非文件上传请求记录body // 非文件上传请求记录body
if (!LogUtils.isMultipartContent(request)) { if (!LogUtils.isMultipartContent(request)) {
adminAccessLog.setReqBody(LogUtils.getRequestBody(request)); adminAccessLog.setReqBody(LogUtils.getRequestBody(request));

View File

@@ -1,5 +1,6 @@
package com.hccake.ballcat.common.conf.web; package com.hccake.ballcat.common.conf.web;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.hccake.ballcat.common.conf.config.MonitorProperties; import com.hccake.ballcat.common.conf.config.MonitorProperties;
import com.hccake.ballcat.common.core.filter.ActuatorAuthFilter; import com.hccake.ballcat.common.core.filter.ActuatorAuthFilter;
import com.hccake.ballcat.common.core.filter.XSSFilter; import com.hccake.ballcat.common.core.filter.XSSFilter;
@@ -32,13 +33,15 @@ public class FilterConfig {
@Bean @Bean
@ConditionalOnProperty(prefix = "ballcat.actuator", name = "auth", havingValue = "true") @ConditionalOnProperty(prefix = "ballcat.actuator", name = "auth", havingValue = "true")
public FilterRegistrationBean<ActuatorAuthFilter> actuatorFilterRegistrationBean(MonitorProperties properties) { public FilterRegistrationBean<ActuatorAuthFilter> actuatorFilterRegistrationBean(MonitorProperties properties,
ObjectMapper objectMapper) {
log.debug("Actuator 过滤器已开启===="); log.debug("Actuator 过滤器已开启====");
FilterRegistrationBean<ActuatorAuthFilter> registrationBean = new FilterRegistrationBean<>(); FilterRegistrationBean<ActuatorAuthFilter> registrationBean = new FilterRegistrationBean<>();
MonitorProperties.Actuator actuator = properties.getActuator(); MonitorProperties.Actuator actuator = properties.getActuator();
if (actuator.getAuth()) { if (actuator.getAuth()) {
// 监控开启 // 监控开启
ActuatorAuthFilter filter = new ActuatorAuthFilter(actuator.getSecretId(), actuator.getSecretKey()); ActuatorAuthFilter filter = new ActuatorAuthFilter(actuator.getSecretId(), actuator.getSecretKey(),
objectMapper);
registrationBean.setFilter(filter); registrationBean.setFilter(filter);
registrationBean.addUrlPatterns("/actuator/*"); registrationBean.addUrlPatterns("/actuator/*");
registrationBean.setOrder(0); registrationBean.setOrder(0);

View File

@@ -2,7 +2,7 @@ package com.hccake.ballcat.common.core.filter;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.SecureUtil;
import cn.hutool.json.JSONUtil; import com.fasterxml.jackson.databind.ObjectMapper;
import com.hccake.ballcat.common.core.constant.HeaderConstants; import com.hccake.ballcat.common.core.constant.HeaderConstants;
import com.hccake.ballcat.common.core.result.R; import com.hccake.ballcat.common.core.result.R;
import com.hccake.ballcat.common.core.result.SystemResultCode; import com.hccake.ballcat.common.core.result.SystemResultCode;
@@ -29,14 +29,17 @@ public class ActuatorAuthFilter extends OncePerRequestFilter {
private final String secretKey; private final String secretKey;
private final ObjectMapper objectMapper;
/** /**
* Instantiates a new Actuator filter. * Instantiates a new Actuator filter.
* @param secretId the secret id * @param secretId the secret id
* @param secretKey the secret key * @param secretKey the secret key
*/ */
public ActuatorAuthFilter(String secretId, String secretKey) { public ActuatorAuthFilter(String secretId, String secretKey, ObjectMapper objectMapper) {
this.secretId = secretId; this.secretId = secretId;
this.secretKey = secretKey; this.secretKey = secretKey;
this.objectMapper = objectMapper;
} }
/** /**
@@ -64,7 +67,8 @@ public class ActuatorAuthFilter extends OncePerRequestFilter {
else { else {
response.setHeader("Content-Type", MediaType.APPLICATION_JSON.toString()); response.setHeader("Content-Type", MediaType.APPLICATION_JSON.toString());
response.setStatus(HttpStatus.UNAUTHORIZED.value()); response.setStatus(HttpStatus.UNAUTHORIZED.value());
response.getWriter().write(JSONUtil.toJsonStr(R.failed(SystemResultCode.UNAUTHORIZED))); String result = objectMapper.writeValueAsString(R.failed(SystemResultCode.UNAUTHORIZED));
response.getWriter().write(result);
} }
} }

View File

@@ -1,9 +1,11 @@
package com.hccake.ballcat.commom.log.operation; package com.hccake.ballcat.commom.log.operation;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.hccake.ballcat.commom.log.operation.aspect.OperationLogAspect; import com.hccake.ballcat.commom.log.operation.aspect.OperationLogAspect;
import com.hccake.ballcat.commom.log.operation.event.OperationLogListener; import com.hccake.ballcat.commom.log.operation.event.OperationLogListener;
import com.hccake.ballcat.commom.log.operation.service.OperationLogHandler; import com.hccake.ballcat.commom.log.operation.service.OperationLogHandler;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
/** /**
@@ -29,8 +31,8 @@ public class OperationLogAutoConfiguration {
*/ */
@Bean @Bean
@ConditionalOnBean(OperationLogHandler.class) @ConditionalOnBean(OperationLogHandler.class)
public OperationLogAspect operationLogAspect() { public OperationLogAspect operationLogAspect(ObjectMapper objectMapper, ApplicationEventPublisher publisher) {
return new OperationLogAspect(); return new OperationLogAspect(objectMapper, publisher);
} }
} }

View File

@@ -1,6 +1,9 @@
package com.hccake.ballcat.commom.log.operation.aspect; package com.hccake.ballcat.commom.log.operation.aspect;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.URLUtil; import cn.hutool.core.util.URLUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.hccake.ballcat.commom.log.constant.LogConstant; import com.hccake.ballcat.commom.log.constant.LogConstant;
import com.hccake.ballcat.commom.log.operation.annotation.OperationLogging; import com.hccake.ballcat.commom.log.operation.annotation.OperationLogging;
import com.hccake.ballcat.commom.log.operation.enums.LogStatusEnum; import com.hccake.ballcat.commom.log.operation.enums.LogStatusEnum;
@@ -8,13 +11,14 @@ import com.hccake.ballcat.commom.log.operation.event.OperationLogEvent;
import com.hccake.ballcat.commom.log.operation.model.OperationLogDTO; import com.hccake.ballcat.commom.log.operation.model.OperationLogDTO;
import com.hccake.ballcat.commom.log.util.LogUtils; import com.hccake.ballcat.commom.log.util.LogUtils;
import com.hccake.ballcat.common.core.util.IPUtil; import com.hccake.ballcat.common.core.util.IPUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature; import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.MDC; import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.annotation.AnnotatedElementUtils;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
@@ -23,6 +27,8 @@ import org.springframework.util.Assert;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
/** /**
@@ -33,10 +39,12 @@ import java.util.Objects;
@Slf4j @Slf4j
@Aspect @Aspect
@Order(0) @Order(0)
@RequiredArgsConstructor
public class OperationLogAspect { public class OperationLogAspect {
@Autowired private final ObjectMapper objectMapper;
private ApplicationEventPublisher publisher;
private final ApplicationEventPublisher publisher;
@Around("execution(@(@com.hccake.ballcat.commom.log.operation.annotation.OperationLogging *) * *(..)) " @Around("execution(@(@com.hccake.ballcat.commom.log.operation.annotation.OperationLogging *) * *(..)) "
+ "|| @annotation(com.hccake.ballcat.commom.log.operation.annotation.OperationLogging)") + "|| @annotation(com.hccake.ballcat.commom.log.operation.annotation.OperationLogging)")
@@ -91,9 +99,43 @@ public class OperationLogAspect {
.setUri(URLUtil.getPath(request.getRequestURI())) .setUri(URLUtil.getPath(request.getRequestURI()))
.setType(operationLogging.type().getValue()) .setType(operationLogging.type().getValue())
.setMsg(operationLogging.msg()) .setMsg(operationLogging.msg())
.setParams(LogUtils.getParams(joinPoint)) .setParams(getParams(joinPoint))
.setTraceId(MDC.get(LogConstant.TRACE_ID)); .setTraceId(MDC.get(LogConstant.TRACE_ID));
// @formatter:on // @formatter:on
} }
/**
* 获取方法参数
* @param joinPoint 切点
* @return 当前方法入参的Json Str
*/
private String getParams(ProceedingJoinPoint joinPoint) {
// 获取方法签名
Signature signature = joinPoint.getSignature();
String strClassName = joinPoint.getTarget().getClass().getName();
String strMethodName = signature.getName();
MethodSignature methodSignature = (MethodSignature) signature;
log.debug("[getParams],获取方法参数[类名]:{},[方法]:{}", strClassName, strMethodName);
String[] parameterNames = methodSignature.getParameterNames();
Object[] args = joinPoint.getArgs();
if (ArrayUtil.isEmpty(parameterNames)) {
return null;
}
Map<String, Object> paramsMap = new HashMap<>();
for (int i = 0; i < parameterNames.length; i++) {
paramsMap.put(parameterNames[i], args[i]);
}
String params = "";
try {
params = objectMapper.writeValueAsString(paramsMap);
}
catch (JsonProcessingException e) {
log.error("[getParams],获取方法参数异常,[类名]:{},[方法]:{}", strClassName, strMethodName, e);
}
return params;
}
} }

View File

@@ -1,12 +1,7 @@
package com.hccake.ballcat.commom.log.util; package com.hccake.ballcat.commom.log.util;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.json.JSONUtil;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
@@ -18,8 +13,6 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -118,29 +111,4 @@ public class LogUtils {
.getRequest(); .getRequest();
} }
/**
* 获取方法参数
* @param joinPoint 切点
* @return 当前方法入参的Json Str
*/
public String getParams(ProceedingJoinPoint joinPoint) {
// 获取方法签名
Signature signature = joinPoint.getSignature();
String strClassName = joinPoint.getTarget().getClass().getName();
String strMethodName = signature.getName();
MethodSignature methodSignature = (MethodSignature) signature;
log.debug("[initOperationLog],获取方法签名[类名]:{},[方法]:{}", strClassName, strMethodName);
String[] parameterNames = methodSignature.getParameterNames();
Object[] args = joinPoint.getArgs();
if (ArrayUtil.isEmpty(parameterNames)) {
return null;
}
Map<String, Object> paramsMap = new HashMap<>();
for (int i = 0; i < parameterNames.length; i++) {
paramsMap.put(parameterNames[i], args[i]);
}
return JSONUtil.toJsonStr(paramsMap);
}
} }