您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
本篇内容介绍了“springboot启动项目打印接口列表的实现方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
springboot 启动项目打印接口列表
环境
修改配置文件
Springboot项目添加接口入参统一打印
新建注解,用于实现参数打印功能的增强
自定义序列化规则
写参数打印增强,这里选择环绕增强
springboot 2.3.2.RELEASE
logging: level: org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: trace
结果:
需求:要求接口被调用时要打印被调用方法名,以及入参情况,参数格式化时选择fastjson
注:使用fastjson序列化时脱敏,建议入参统一使用自定义的对象类型作为入参
如果不需要参数脱敏,直接使用增强中相关代码,并去除参数脱敏相关代码即可
@Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ParamInfo { /** * 取消统一打印参数 * 默认为false统一打印 * 如需自定义参数打印 请赋值为true */ boolean unPrint() default false; /** * 需要脱敏的字段,如密码等 */ String[] fields() default {}; }
/** * 序列化过滤器:值替换 * */ public class ReplaceFieldFilter implements ValueFilter { /** * 需要进行替换的属性名和替换值 * key:属性名 * value:替换值 */ private Map<String, Object> fieldMap; public ReplaceFieldFilter() { } public ReplaceFieldFilter(Map<String, Object> fieldMap) { this.fieldMap = fieldMap; } @Override public Object process(Object o, String name, Object value) { if(!CollectionUtils.isEmpty(fieldMap)){ Iterator<Map.Entry<String, Object>> iterator = fieldMap.entrySet().iterator(); while (iterator.hasNext()){ Map.Entry<String, Object> next = iterator.next(); if(next.getKey().equalsIgnoreCase(name)){ return next.getValue(); } } } return value; } public Map<String, Object> getFieldMap() { return fieldMap; } public void setFieldMap(Map<String, Object> fieldMap) { this.fieldMap = fieldMap; } /** * 传入需要脱敏的字段名,序列化时格式化为 * 号 */ public ReplaceFieldFilter(String... fields) { String str = "******"; fieldMap = new HashMap<>(4); for (String field : fields) { fieldMap.put(field, str); } } }
@Component @Aspect //表示增强的执行顺序,如果多个增强,数值小的先被执行 @Order(0) public class ParamInfoAspect { private static final Logger LOGGER = LoggerFactory.getLogger(ParamInfoAspect.class); @Around("execution(* com.service.impl.*.*(..))") public Object printParam(ProceedingJoinPoint joinPoint) throws Throwable { long startTime = System.currentTimeMillis(); String requestId = RandomStringUtils.randomAlphanumeric(16); Object returnValue = null; try { Object[] args = joinPoint.getArgs(); // 获取方法对象 MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); //通过注解获取脱敏字段,之后初始化fieldMap,完成字段脱敏 ParamInfo annotation = method.getAnnotation(ParamInfo.class); Map<String, Object> fieldMap = new HashMap<>(4); fieldMap.put("password", "******"); if (annotation != null) { //获取需要脱敏的字段名数组 String[] fields = annotation.fields(); for (String field : fields) { fieldMap.put(field, "******"); } } String param; //参数整合,多字段入参整合为对象,单个对象入参格式不变 if (args.length > 1 || (args.length == 1 && args[0].getClass() == String.class)) { Map<String, Object> paramMap = new LinkedHashMap<>(); String[] parameterNames = signature.getParameterNames(); for (int i = 0; i < parameterNames.length; i++) { paramMap.put(parameterNames[i], args[i]); } param = "[" + JSON.toJSONString(paramMap, new ReplaceFieldFilter(fieldMap)) + "]"; } else { param = JSON.toJSONString(args, new ReplaceFieldFilter(fieldMap)); } String methodName = method.getName(); LOGGER.info("method:[{}], parameter:{}, requestId:[{}]", methodName, param, requestId); returnValue = joinPoint.proceed(); return returnValue; } catch (Exception e) { LOGGER.error("system is error:", e); //可在这里定义程序异常时的错误返回值 returnValue = ErrorCode.SYSTEM_ERROR; return returnValue; } finally { LOGGER.info("request cost:{}ms, requestId:[{}]", System.currentTimeMillis() - startTime, requestId); LOGGER.info("returnValue:[{}], requestId:[{}]", returnValue, requestId); } } }
“springboot启动项目打印接口列表的实现方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。