🚑 Hutool中JsonUtil会导致部分情况下stackoverflow,暂时先更新为使用jackson进行序列化
This commit is contained in:
@@ -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));
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user