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

View File

@@ -1,5 +1,6 @@
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.core.filter.ActuatorAuthFilter;
import com.hccake.ballcat.common.core.filter.XSSFilter;
@@ -32,13 +33,15 @@ public class FilterConfig {
@Bean
@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 过滤器已开启====");
FilterRegistrationBean<ActuatorAuthFilter> registrationBean = new FilterRegistrationBean<>();
MonitorProperties.Actuator actuator = properties.getActuator();
if (actuator.getAuth()) {
// 监控开启
ActuatorAuthFilter filter = new ActuatorAuthFilter(actuator.getSecretId(), actuator.getSecretKey());
ActuatorAuthFilter filter = new ActuatorAuthFilter(actuator.getSecretId(), actuator.getSecretKey(),
objectMapper);
registrationBean.setFilter(filter);
registrationBean.addUrlPatterns("/actuator/*");
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.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.result.R;
import com.hccake.ballcat.common.core.result.SystemResultCode;
@@ -29,14 +29,17 @@ public class ActuatorAuthFilter extends OncePerRequestFilter {
private final String secretKey;
private final ObjectMapper objectMapper;
/**
* Instantiates a new Actuator filter.
* @param secretId the secret id
* @param secretKey the secret key
*/
public ActuatorAuthFilter(String secretId, String secretKey) {
public ActuatorAuthFilter(String secretId, String secretKey, ObjectMapper objectMapper) {
this.secretId = secretId;
this.secretKey = secretKey;
this.objectMapper = objectMapper;
}
/**
@@ -64,7 +67,8 @@ public class ActuatorAuthFilter extends OncePerRequestFilter {
else {
response.setHeader("Content-Type", MediaType.APPLICATION_JSON.toString());
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;
import com.fasterxml.jackson.databind.ObjectMapper;
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.service.OperationLogHandler;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.Bean;
/**
@@ -29,8 +31,8 @@ public class OperationLogAutoConfiguration {
*/
@Bean
@ConditionalOnBean(OperationLogHandler.class)
public OperationLogAspect operationLogAspect() {
return new OperationLogAspect();
public OperationLogAspect operationLogAspect(ObjectMapper objectMapper, ApplicationEventPublisher publisher) {
return new OperationLogAspect(objectMapper, publisher);
}
}

View File

@@ -1,6 +1,9 @@
package com.hccake.ballcat.commom.log.operation.aspect;
import cn.hutool.core.util.ArrayUtil;
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.operation.annotation.OperationLogging;
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.util.LogUtils;
import com.hccake.ballcat.common.core.util.IPUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.core.annotation.AnnotatedElementUtils;
import org.springframework.core.annotation.Order;
@@ -23,6 +27,8 @@ import org.springframework.util.Assert;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
@@ -33,10 +39,12 @@ import java.util.Objects;
@Slf4j
@Aspect
@Order(0)
@RequiredArgsConstructor
public class OperationLogAspect {
@Autowired
private ApplicationEventPublisher publisher;
private final ObjectMapper objectMapper;
private final ApplicationEventPublisher publisher;
@Around("execution(@(@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()))
.setType(operationLogging.type().getValue())
.setMsg(operationLogging.msg())
.setParams(LogUtils.getParams(joinPoint))
.setParams(getParams(joinPoint))
.setTraceId(MDC.get(LogConstant.TRACE_ID));
// @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;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.json.JSONUtil;
import lombok.experimental.UtilityClass;
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.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
@@ -18,8 +13,6 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
@@ -118,29 +111,4 @@ public class LogUtils {
.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);
}
}