请选择 进入手机版 | 继续访问电脑版

[java] springboot 启动项目打印接口列表的实现

[复制链接]
查看94 | 回复10 | 2021-9-13 02:27:22 | 显示全部楼层 |阅读模式
目次

springboot 启动项目打印接口列表

环境

  • springboot 2.3.2.RELEASE

修改设置 文件

  1. logging:
  2. level:
  3. org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: trace
复制代码

效果 :

在这里插入图片形貌

Springboot项目添加接口入参同一 打印

需求:要求接口被调用时要打印被调用方法名,以及入参环境 ,参数格式化时选择fastjson

注:利用 fastjson序列化时脱敏,建议入参同一 利用 自定义的对象范例 作为入参

假如 不必要 参数脱敏,直接利用 加强 中相干 代码,并去除参数脱敏相干 代码即可

新建注解,用于实现参数打印功能的加强

  1. @Target({ElementType.METHOD})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface ParamInfo {
  5. /**
  6. * 取消统一打印参数
  7. * 默认为false统一打印
  8. * 如需自定义参数打印 请赋值为true
  9. */
  10. boolean unPrint() default false;
  11. /**
  12. * 需要脱敏的字段,如密码等
  13. */
  14. String[] fields() default {};
  15. }
复制代码

自定义序列化规则

  1. /**
  2. * 序列化过滤器:值替换
  3. *
  4. */
  5. public class ReplaceFieldFilter implements ValueFilter {
  6. /**
  7. * 需要进行替换的属性名和替换值
  8. * key:属性名
  9. * value:替换值
  10. */
  11. private Map<String, Object> fieldMap;
  12. public ReplaceFieldFilter() {
  13. }
  14. public ReplaceFieldFilter(Map<String, Object> fieldMap) {
  15. this.fieldMap = fieldMap;
  16. }
  17. @Override
  18. public Object process(Object o, String name, Object value) {
  19. if(!CollectionUtils.isEmpty(fieldMap)){
  20. Iterator<Map.Entry<String, Object>> iterator = fieldMap.entrySet().iterator();
  21. while (iterator.hasNext()){
  22. Map.Entry<String, Object> next = iterator.next();
  23. if(next.getKey().equalsIgnoreCase(name)){
  24. return next.getValue();
  25. }
  26. }
  27. }
  28. return value;
  29. }
  30. public Map<String, Object> getFieldMap() {
  31. return fieldMap;
  32. }
  33. public void setFieldMap(Map<String, Object> fieldMap) {
  34. this.fieldMap = fieldMap;
  35. }
  36. /**
  37. * 传入需要脱敏的字段名,序列化时格式化为 * 号
  38. */
  39. public ReplaceFieldFilter(String... fields) {
  40. String str = "******";
  41. fieldMap = new HashMap<>(4);
  42. for (String field : fields) {
  43. fieldMap.put(field, str);
  44. }
  45. }
  46. }
复制代码

写参数打印加强 ,这里选择环绕加强

  1. @Component
  2. @Aspect
  3. //表示增强的执行顺序,如果多个增强,数值小的先被执行
  4. @Order(0)
  5. public class ParamInfoAspect {
  6. private static final Logger LOGGER = LoggerFactory.getLogger(ParamInfoAspect.class);
  7. @Around("execution(* com.service.impl.*.*(..))")
  8. public Object printParam(ProceedingJoinPoint joinPoint) throws Throwable {
  9. long startTime = System.currentTimeMillis();
  10. String requestId = RandomStringUtils.randomAlphanumeric(16);
  11. Object returnValue = null;
  12. try {
  13. Object[] args = joinPoint.getArgs();
  14. // 获取方法对象
  15. MethodSignature signature = (MethodSignature) joinPoint.getSignature();
  16. Method method = signature.getMethod();
  17. //通过注解获取脱敏字段,之后初始化fieldMap,完成字段脱敏
  18. ParamInfo annotation = method.getAnnotation(ParamInfo.class);
  19. Map<String, Object> fieldMap = new HashMap<>(4);
  20. fieldMap.put("password", "******");
  21. if (annotation != null) {
  22. //获取需要脱敏的字段名数组
  23. String[] fields = annotation.fields();
  24. for (String field : fields) {
  25. fieldMap.put(field, "******");
  26. }
  27. }
  28. String param;
  29. //参数整合,多字段入参整合为对象,单个对象入参格式不变
  30. if (args.length > 1 || (args.length == 1 && args[0].getClass() == String.class)) {
  31. Map<String, Object> paramMap = new LinkedHashMap<>();
  32. String[] parameterNames = signature.getParameterNames();
  33. for (int i = 0; i < parameterNames.length; i++) {
  34. paramMap.put(parameterNames[i], args[i]);
  35. }
  36. param = "[" + JSON.toJSONString(paramMap, new ReplaceFieldFilter(fieldMap)) + "]";
  37. } else {
  38. param = JSON.toJSONString(args, new ReplaceFieldFilter(fieldMap));
  39. }
  40. String methodName = method.getName();
  41. LOGGER.info("method:[{}], parameter:{}, requestId:[{}]", methodName, param, requestId);
  42. returnValue = joinPoint.proceed();
  43. return returnValue;
  44. } catch (Exception e) {
  45. LOGGER.error("system is error:", e);
  46. //可在这里定义程序异常时的错误返回值
  47. returnValue = ErrorCode.SYSTEM_ERROR;
  48. return returnValue;
  49. } finally {
  50. LOGGER.info("request cost:{}ms, requestId:[{}]", System.currentTimeMillis() - startTime, requestId);
  51. LOGGER.info("returnValue:[{}], requestId:[{}]", returnValue, requestId);
  52. }
  53. }
  54. }
复制代码

以上为个人履历 ,盼望 能给大家一个参考,也盼望 大家多多支持脚本之家。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 穿雨捶 | 2021-9-19 19:30:19 | 显示全部楼层
今天怎么了,什么人都出来了!
回复

使用道具 举报

avatar 喵呜_520 | 2021-9-20 10:16:10 | 显示全部楼层
很经典,收藏了!
回复

使用道具 举报

avatar dw3995 | 2021-10-7 15:48:04 | 显示全部楼层
帖子好乱!
回复

使用道具 举报

avatar 都市夜归人PLA | 2021-10-9 07:33:20 | 显示全部楼层
信admin楼主,得永生!
回复

使用道具 举报

信admin楼主,考试不挂科!
回复

使用道具 举报

楼上的说的很好!
回复

使用道具 举报

系统居然说我是在灌水,我有吗?
回复

使用道具 举报

admin楼主给脑残下了定义!
回复

使用道具 举报

每次看到admin楼主的帖子都有惊吓!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则