亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

springboot 啟動項目打印接口列表的實現(xiàn)

 更新時間:2021年09月11日 08:44:50   作者:enjoy囂士  
這篇文章主要介紹了springboot 啟動項目打印接口列表的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

springboot 啟動項目打印接口列表

環(huán)境

  • springboot 2.3.2.RELEASE

修改配置文件

logging:
  level:
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: trace

結果:

在這里插入圖片描述

Springboot項目添加接口入?yún)⒔y(tǒng)一打印

需求:要求接口被調(diào)用時要打印被調(diào)用方法名,以及入?yún)⑶闆r,參數(shù)格式化時選擇fastjson

注:使用fastjson序列化時脫敏,建議入?yún)⒔y(tǒng)一使用自定義的對象類型作為入?yún)?/p>

如果不需要參數(shù)脫敏,直接使用增強中相關代碼,并去除參數(shù)脫敏相關代碼即可

新建注解,用于實現(xiàn)參數(shù)打印功能的增強

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ParamInfo {
    /**
     * 取消統(tǒng)一打印參數(shù)
     * 默認為false統(tǒng)一打印
     * 如需自定義參數(shù)打印 請賦值為true
     */
    boolean unPrint() default false;
    /**
     * 需要脫敏的字段,如密碼等
     */
    String[] fields() default {};
}

自定義序列化規(guī)則

/**
 * 序列化過濾器:值替換
 *
 */
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);
        }
    }
}

寫參數(shù)打印增強,這里選擇環(huán)繞增強

@Component
@Aspect
//表示增強的執(zhí)行順序,如果多個增強,數(shù)值小的先被執(zhí)行
@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) {
                //獲取需要脫敏的字段名數(shù)組
                String[] fields = annotation.fields();
                for (String field : fields) {
                    fieldMap.put(field, "******");
                }
            }
            String param;
            //參數(shù)整合,多字段入?yún)⒄蠟閷ο?,單個對象入?yún)⒏袷讲蛔?
            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);
        }
    }
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java 8中日期和時間的處理方法

    Java 8中日期和時間的處理方法

    Java 8新增了LocalDate和LocalTime接口,接下來通過本文給大家介紹Java 8中日期和時間的處理方法,非常不錯,感興趣的朋友一起看下吧
    2016-08-08
  • SpringBoot Controller中的常用注解

    SpringBoot Controller中的常用注解

    這篇文章主要介紹了SpringBoot Controller中的常用注解,文章圍繞主題展開詳細的內(nèi)容介紹,具有有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • 基于Java內(nèi)存溢出的解決方法詳解

    基于Java內(nèi)存溢出的解決方法詳解

    本篇文章是對Java內(nèi)存溢出的解決方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 淺談Java實現(xiàn)分布式事務的三種方案

    淺談Java實現(xiàn)分布式事務的三種方案

    現(xiàn)在互聯(lián)網(wǎng)下,分布式和微服務橫行,難免會遇到分布式下的事務問題,當然微服務下可能沒有分布式事務,但是很多場景是需要分布式事務的。下面就來介紹下什么是分布式事務和分布式事務的解決方案
    2021-06-06
  • Spring Boot將項目打包成war包的操作方法

    Spring Boot將項目打包成war包的操作方法

    這篇文章主要介紹了Spring Boot將項目打包成war包的操作方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • 淺談Spring注入模型

    淺談Spring注入模型

    如果不深入到Spring的源碼,是很少有機會了解到Spring的注入模型(AutowireMode)。但是為了掃清我們學習Spring源碼的障礙,我們有必要了解下Spring的注入模型,感興趣的同學可以閱讀一下
    2023-04-04
  • Java 文創(chuàng)商城系統(tǒng)的實現(xiàn)流程

    Java 文創(chuàng)商城系統(tǒng)的實現(xiàn)流程

    讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+mysql+maven+tomcat實現(xiàn)一個文創(chuàng)商城系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2021-11-11
  • 最新log4j2遠程代碼執(zhí)行漏洞(附解決方法)

    最新log4j2遠程代碼執(zhí)行漏洞(附解決方法)

    Apache?Log4j2?遠程代碼執(zhí)行漏洞攻擊代碼,該漏洞利用無需特殊配置,經(jīng)多方驗證,Apache?Struts2、Apache?Solr、Apache?Druid、Apache?Flink等均受影響,本文就介紹一下解決方法
    2021-12-12
  • spring?java?動態(tài)獲取consul?K/V的方法

    spring?java?動態(tài)獲取consul?K/V的方法

    這篇文章主要介紹了spring?java?動態(tài)獲取consul?K/V的相關資料,主要包括springConsul配置kv路徑以及自動注入consulKV到服務中,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • ruoyi-springboot框架新增模塊調(diào)接口報404的解決方案

    ruoyi-springboot框架新增模塊調(diào)接口報404的解決方案

    這篇文章主要介紹了ruoyi-springboot框架新增模塊調(diào)接口報404的解決方案,文中通過代碼示例給大家講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-03-03

最新評論