欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java?如何通過注解實現(xiàn)接口輸出時數(shù)據(jù)脫敏

 更新時間:2021年12月18日 10:35:25   作者:aka這里是你的程序員  
這篇文章主要介紹了Java?如何通過注解實現(xiàn)接口輸出時數(shù)據(jù)脫敏,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Java注解實現(xiàn)接口輸出數(shù)據(jù)脫敏

在后臺管理中,對于手機號,身份證,姓名這些數(shù)據(jù)不允許所有人都能看,這時候我們要對相對數(shù)據(jù)進行脫敏.

先聲明了一個注解

通過對相關(guān)接口函數(shù)進行聲明,以及配置需要脫敏的參數(shù)類型SecretTypeEnum,默認脫敏手機號

/**
 * 脫敏聲明
 */
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SecretManage {

    SecretTypeEnum[] value() default {SecretTypeEnum.MOBILE};

}

我們目前只支持對手機號

身份證,用戶姓名三個字段進行脫敏, 字段名稱必須符合枚舉的desc值

package com.test.base.enums;


import com.fasterxml.jackson.annotation.JsonValue;

/**
 * @author fyf
 * @date 2021/2/26
 */
public enum SecretTypeEnum implements BaseEnum {
    MOBILE(0, "mobile"),
    NAME(1, "name"),
    ID(2, "identity")
    ;

    @JsonValue
    private int code;
    private String desc;

    public String getDesc() {
        return desc;
    }

    SecretTypeEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    @Override
    public int code() {
        return code;
    }

    public static SecretTypeEnum checkParam(String paramName) {
        SecretTypeEnum[] values = values();
        for (int i = 0; i < values.length; i++) {
            if (paramName.equals(values[i].getDesc())) {
                return values[i];
            }
        }
        return null;
    }
}

然后我們需要實現(xiàn)注解的攔截功能

/**
 * 對字段進行脫敏管理
 * @author: fyf
 * @date: 2021/02/23
 */
@Order(1)
@Aspect
@Component
public class SecretManageAspect {

    @Pointcut("@annotation(com.test.base.annotations.SecretManage)")
    public void pointCut() {
    }


    @Around("pointCut() && @annotation(secretManage)")
    public Object secretManageAround(ProceedingJoinPoint joinPoint, SecretManage secretManage) throws Throwable {
        Class returnType = ((MethodSignature) joinPoint.getSignature()).getReturnType();
        Object invokeResult = joinPoint.proceed();
        if (returnType.isInstance(invokeResult)) {
            returnType.cast(invokeResult);
        }
        Field[] fields = returnType.getDeclaredFields();
        List<SecretTypeEnum> annotationSecretTypeEnums = Arrays.asList(secretManage.value());
        for (Field field : fields) {
            String fieldName = field.getName();
            Class<?> paramType = field.getType();
            System.out.println("字段名稱:" + fieldName);
            SecretTypeEnum secretTypeEnum = SecretTypeEnum.checkParam(fieldName);
            long count = annotationSecretTypeEnums.stream().filter(item -> item.equals(secretTypeEnum)).count();
            if (secretTypeEnum != null && count > 0) {
                fieldName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
                // 獲取到setter方法
                Method setMethod = returnType.getMethod("set" + fieldName, new Class[]{paramType});
                // 獲取到getter方法
                Method getMethod = returnType.getMethod("get" + fieldName);
                // 執(zhí)行g(shù)etter方法
                Object value = getMethod.invoke(invokeResult);
                this.invokeSetter(setMethod, invokeResult, secretTypeEnum, value);
            }
        }
        return invokeResult;
    }

    /**
     * 封裝執(zhí)行setter函數(shù)
     */
    private void invokeSetter(Method setterMethod, Object invokeResult, SecretTypeEnum secretTypeEnum, Object value)
        throws InvocationTargetException, IllegalAccessException {
        switch (secretTypeEnum) {
            case NAME:
                setterMethod.invoke(invokeResult, SecretUtil.nameSecret(value.toString()));
                break;
            case MOBILE:
                setterMethod.invoke(invokeResult, SecretUtil.mobileSecret(value.toString()));
                break;
            case ID:
                setterMethod.invoke(invokeResult, SecretUtil.idNoSecret(value.toString()));
                break;
        }
    }
}

上面我們就是實現(xiàn)了脫敏的功能,現(xiàn)在我們可以mock接口看看結(jié)果了,

我對默認聲明和脫敏名稱和手機號進行了測試

	/**
	 *  curl localhost:9999/user/test-secret
	 */
	@GetMapping("/test-secret")
//	@SecretManage(value = {SecretTypeEnum.NAME, SecretTypeEnum.MOBILE})
	@SecretManage
	public User getSecretUser() {
		User user = new User();
		user.setId(1);
		user.setMobile("13715166409");
		user.setName("張志新");
		user.setIdentity("370283790911703");
		return user;
	}

下面是測試結(jié)果

在這里插入圖片描述

Java注解的字段脫敏處理

有這樣一個場景,系統(tǒng)中可以出現(xiàn)敏感的數(shù)據(jù),在打印日志的時候,我們并不希望打印出現(xiàn),這樣,我們使用自己定義注解,來解決這個問題。

定義需要脫敏的字段規(guī)則

import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
 
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
 
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.google.gson.Gson;
import com.ucf.platform.framework.core.annotation.SensitiveInfo;
import com.ucf.platform.framework.core.log.UcfLogger;
import com.ucf.platform.framework.core.log.UcfLoggerFactory;
 
/**
 * @Title: SensitiveInfoUtils.java
 * @Copyright: Copyright (c) 2011
 * @Description: <br>
 *               敏感信息屏蔽工具<br>
  */
public final class SensitiveInfoUtils {
 
    private final static UcfLogger logger = UcfLoggerFactory.getLogger(SensitiveInfoUtils.class);
 
    /**
     * [中文姓名] 只顯示第一個漢字,其他隱藏為2個星號<例子:李**>
     * 
     * @param name
     * @return
     */
    public static String chineseName(String fullName) {
        if (StringUtils.isBlank(fullName)) {
            return "";
        }
        String name = StringUtils.left(fullName, 1);
        return StringUtils.rightPad(name, StringUtils.length(fullName), "*");
    }
 
    /**
     * [中文姓名] 只顯示第一個漢字,其他隱藏為2個星號<例子:李**>
     * 
     * @param familyName
     * @param givenName
     * @return
     */
    public static String chineseName(String familyName, String givenName) {
        if (StringUtils.isBlank(familyName) || StringUtils.isBlank(givenName)) {
            return "";
        }
        return chineseName(familyName + givenName);
    }
 
    /**
     * [身份證號] 顯示最后四位,其他隱藏。共計18位或者15位。<例子:*************5762>
     * 
     * @param id
     * @return
     */
    public static String idCardNum(String id) {
        if (StringUtils.isBlank(id)) {
            return "";
        }
        String num = StringUtils.right(id, 4);
        return StringUtils.leftPad(num, StringUtils.length(id), "*");
    }
 
    /**
     * [固定電話] 后四位,其他隱藏<例子:****1234>
     * 
     * @param num
     * @return
     */
    public static String fixedPhone(String num) {
        if (StringUtils.isBlank(num)) {
            return "";
        }
        return StringUtils.leftPad(StringUtils.right(num, 4), StringUtils.length(num), "*");
    }
 
    /**
     * [手機號碼] 前三位,后四位,其他隱藏<例子:138******1234>
     * 
     * @param num
     * @return
     */
    public static String mobilePhone(String num) {
        if (StringUtils.isBlank(num)) {
            return "";
        }
        return StringUtils.left(num, 3).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(num, 4), StringUtils.length(num), "*"), "***"));
    }
 
    /**
     * [地址] 只顯示到地區(qū),不顯示詳細地址;我們要對個人信息增強保護<例子:北京市海淀區(qū)****>
     * 
     * @param address
     * @param sensitiveSize
     *            敏感信息長度
     * @return
     */
    public static String address(String address, int sensitiveSize) {
        if (StringUtils.isBlank(address)) {
            return "";
        }
        int length = StringUtils.length(address);
        return StringUtils.rightPad(StringUtils.left(address, length - sensitiveSize), length, "*");
    }
 
    /**
     * [電子郵箱] 郵箱前綴僅顯示第一個字母,前綴其他隱藏,用星號代替,@及后面的地址顯示<例子:g**@163.com>
     * 
     * @param email
     * @return
     */
    public static String email(String email) {
        if (StringUtils.isBlank(email)) {
            return "";
        }
        int index = StringUtils.indexOf(email, "@");
        if (index <= 1)
            return email;
        else
            return StringUtils.rightPad(StringUtils.left(email, 1), index, "*").concat(StringUtils.mid(email, index, StringUtils.length(email)));
    }
 
    /**
     * [銀行卡號] 前六位,后四位,其他用星號隱藏每位1個星號<例子:6222600**********1234>
     * 
     * @param cardNum
     * @return
     */
    public static String bankCard(String cardNum) {
        if (StringUtils.isBlank(cardNum)) {
            return "";
        }
        return StringUtils.left(cardNum, 6).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(cardNum, 4), StringUtils.length(cardNum), "*"), "******"));
    }
 
    /**
     * [公司開戶銀行聯(lián)號] 公司開戶銀行聯(lián)行號,顯示前兩位,其他用星號隱藏,每位1個星號<例子:12********>
     * 
     * @param code
     * @return
     */
    public static String cnapsCode(String code) {
        if (StringUtils.isBlank(code)) {
            return "";
        }
        return StringUtils.rightPad(StringUtils.left(code, 2), StringUtils.length(code), "*");
    }
 
    /**
     * 獲取脫敏json串 <注意:遞歸引用會導(dǎo)致java.lang.StackOverflowError>
     * 
     * @param javaBean
     * @return
     */
    public static String getJson(Object javaBean) {
        String json = null;
        if (null != javaBean) {
            Class<? extends Object> raw = javaBean.getClass();
            try {
                if (raw.isInterface())
                    return json;
                Gson g = new Gson();
                Object clone = g.fromJson(g.toJson(javaBean, javaBean.getClass()), javaBean.getClass());
                Set<Integer> referenceCounter = new HashSet<Integer>();
                SensitiveInfoUtils.replace(SensitiveInfoUtils.findAllField(raw), clone, referenceCounter);
                json = JSON.toJSONString(clone, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullListAsEmpty);
                referenceCounter.clear();
                referenceCounter = null;
            } catch (Throwable e) {
                logger.error("SensitiveInfoUtils.getJson() ERROR", e);
            }
        }
        return json;
    }
 
    private static Field[] findAllField(Class<?> clazz) {
        Field[] fileds = clazz.getDeclaredFields();
        while (null != clazz.getSuperclass() && !Object.class.equals(clazz.getSuperclass())) {
            fileds = (Field[]) ArrayUtils.addAll(fileds, clazz.getSuperclass().getDeclaredFields());
            clazz = clazz.getSuperclass();
        }
        return fileds;
    }
    private static void replace(Field[] fields, Object javaBean, Set<Integer> referenceCounter) throws IllegalArgumentException, IllegalAccessException {
        if (null != fields && fields.length > 0) {
            for (Field field : fields) {
                field.setAccessible(true);
                if (null != field && null != javaBean) {
                    Object value = field.get(javaBean);
                    if (null != value) {
                        Class<?> type = value.getClass();
                        // 1.處理子屬性,包括集合中的
                        if (type.isArray()) {
                            int len = Array.getLength(value);
                            for (int i = 0; i < len; i++) {
                                Object arrayObject = Array.get(value, i);
                                SensitiveInfoUtils.replace(SensitiveInfoUtils.findAllField(arrayObject.getClass()), arrayObject, referenceCounter);
                            }
                        } else if (value instanceof Collection<?>) {
                            Collection<?> c = (Collection<?>) value;
                            Iterator<?> it = c.iterator();
                            while (it.hasNext()) {
                                Object collectionObj = it.next();
                                SensitiveInfoUtils.replace(SensitiveInfoUtils.findAllField(collectionObj.getClass()), collectionObj, referenceCounter);
                            }
                        } else if (value instanceof Map<?, ?>) {
                            Map<?, ?> m = (Map<?, ?>) value;
                            Set<?> set = m.entrySet();
                            for (Object o : set) {
                                Entry<?, ?> entry = (Entry<?, ?>) o;
                                Object mapVal = entry.getValue();
                                SensitiveInfoUtils.replace(SensitiveInfoUtils.findAllField(mapVal.getClass()), mapVal, referenceCounter);
                            }
                        } else if (!type.isPrimitive()
                                   && !StringUtils.startsWith(type.getPackage().getName(), "javax.")
                                   && !StringUtils.startsWith(type.getPackage().getName(), "java.")
                                   && !StringUtils.startsWith(field.getType().getName(), "javax.")
                                   && !StringUtils.startsWith(field.getName(), "java.")
                                   && referenceCounter.add(value.hashCode())) {
                            SensitiveInfoUtils.replace(SensitiveInfoUtils.findAllField(type), value, referenceCounter);
                        }
                    }
                    // 2. 處理自身的屬性
                    SensitiveInfo annotation = field.getAnnotation(SensitiveInfo.class);
                    if (field.getType().equals(String.class) && null != annotation) {
                        String valueStr = (String) value;
                        if (StringUtils.isNotBlank(valueStr)) {
                            switch (annotation.type()) {
                                case CHINESE_NAME: {
                                    field.set(javaBean, SensitiveInfoUtils.chineseName(valueStr));
                                    break;
                                }
                                case ID_CARD: {
                                    field.set(javaBean, SensitiveInfoUtils.idCardNum(valueStr));
                                    break;
                                }
                                case FIXED_PHONE: {
                                    field.set(javaBean, SensitiveInfoUtils.fixedPhone(valueStr));
                                    break;
                                }
                                case MOBILE_PHONE: {
                                    field.set(javaBean, SensitiveInfoUtils.mobilePhone(valueStr));
                                    break;
                                }
                                case ADDRESS: {
                                    field.set(javaBean, SensitiveInfoUtils.address(valueStr, 4));
                                    break;
                                }
                                case EMAIL: {
                                    field.set(javaBean, SensitiveInfoUtils.email(valueStr));
                                    break;
                                }
                                case BANK_CARD: {
                                    field.set(javaBean, SensitiveInfoUtils.bankCard(valueStr));
                                    break;
                                }
                                case CNAPS_CODE: {
                                    field.set(javaBean, SensitiveInfoUtils.cnapsCode(valueStr));
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
   
//----------------------------------------------------------------------------------------------
    public static Method [] findAllMethod(Class<?> clazz){
        Method [] methods= clazz.getMethods();
        return methods;
    }
  
  //----------------------------------------------------------------------------------------------
    public static enum SensitiveType {
        /**
         * 中文名
         */
        CHINESE_NAME,
 
        /**
         * 身份證號
         */
        ID_CARD,
        /**
         * 座機號
         */
        FIXED_PHONE,
        /**
         * 手機號
         */
        MOBILE_PHONE,
        /**
         * 地址
         */
        ADDRESS,
        /**
         * 電子郵件
         */
        EMAIL,
        /**
         * 銀行卡
         */
        BANK_CARD,
        /**
         * 公司開戶銀行聯(lián)號
         */
        CNAPS_CODE;
    }
}

聲明注解

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
import com.ucf.platform.framework.core.util.SensitiveInfoUtils;
 
/**
 * @Title: SensitiveInfo.java
 * @Copyright: Copyright (c) 2015
 * @Description: <br>
 *               敏感信息注解標記 <br>
 */
@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface SensitiveInfo {
 
    public SensitiveInfoUtils.SensitiveType type() ;
}

測試

public class JavaBeanA {
    
    public JavaBeanA(String name,String id){
        
    }
    
    @SensitiveInfo(type=SensitiveType.CHINESE_NAME)
    private String name = "A先生";
    
    private JavaBeanB b;
    
    private Date date;
    
    private List<JavaBeanB> list;
    
    private Map<String,JavaBeanB> map;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public JavaBeanB getB() {
        return b;
    }
 
    public void setB(JavaBeanB b) {
        this.b = b;
    }
 
    public List<JavaBeanB> getList() {
        return list;
    }
 
    public void setList(List<JavaBeanB> list) {
        this.list = list;
    }
 
    public Map<String, JavaBeanB> getMap() {
        return map;
    }
 
    public void setMap(Map<String, JavaBeanB> map) {
        this.map = map;
    }
 
    public Date getDate() {
        return date;
    }
 
    public void setDate(Date date) {
        this.date = date;
    }
    
}
public class JavaBeanB {
    @SensitiveInfo(type=SensitiveType.CHINESE_NAME)
    private String name = "B先生";
    
    private JavaBeanA a;
    
    private Set<JavaBeanA> list;
    
    private Map<String,JavaBeanA> map;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public JavaBeanA getA() {
        return a;
    }
 
    public void setA(JavaBeanA a) {
        this.a = a;
    }
 
    public Set<JavaBeanA> getList() {
        return list;
    }
 
    public void setList(Set<JavaBeanA> list) {
        this.list = list;
    }
 
    public Map<String, JavaBeanA> getMap() {
        return map;
    }
 
    public void setMap(Map<String, JavaBeanA> map) {
        this.map = map;
    }
}
public class SensitiveInfoUtilsTest {
    
    /**
     * [中文姓名] 只顯示第一個漢字,其他隱藏為2個星號<例子:李**>
     */
    @Test
    public void testChineseNameString() {
        System.out.println(SensitiveInfoUtils.chineseName("李先生"));
    }
 
    /**
     * [中文姓名] 只顯示第一個漢字,其他隱藏為2個星號<例子:李**>
     */
    @Test
    public void testChineseNameStringString() {
        System.out.println(SensitiveInfoUtils.chineseName("李","雷"));
    }
 
    /**
     * [身份證號] 顯示最后四位,其他隱藏。共計18位或者15位。<例子:*************5762>
     */
    @Test
    public void testIdCardNum() {
        System.out.println(SensitiveInfoUtils.idCardNum("1103541983073188711"));
    }
 
    /**
     * [固定電話] 后四位,其他隱藏<例子:****1234>
     */
    @Test
    public void testFixedPhone() {
        System.out.println(SensitiveInfoUtils.fixedPhone("01077482277"));
    }
 
    /**
     * [手機號碼] 前三位,后四位,其他隱藏<例子:138******1234>
     */
    @Test
    public void testMobilePhone() {
        System.out.println(SensitiveInfoUtils.mobilePhone("13777446578"));
    }
 
    /**
     * [地址] 只顯示到地區(qū),不顯示詳細地址;我們要對個人信息增強保護<例子:北京市海淀區(qū)****>
     */
    @Test
    public void testAddress() {
        System.out.println(SensitiveInfoUtils.address("北京朝陽區(qū)酒仙橋中路26號院4號樓人人大廈",8));
    }
 
    /**
     * [電子郵箱] 郵箱前綴僅顯示第一個字母,前綴其他隱藏,用星號代替,@及后面的地址顯示<例子:g**@163.com>
     */
    @Test
    public void testEmail() {
        System.out.println(SensitiveInfoUtils.email("66374777@qq.com"));
    }
 
    /**
     * [銀行卡號] 前六位,后四位,其他用星號隱藏每位1個星號<例子:6222600**********1234>
     */
    @Test
    public void testBankCard() {
        System.out.println(SensitiveInfoUtils.bankCard("6228480402565890018"));
    }
 
    /**
     *  [公司開戶銀行聯(lián)號] 公司開戶銀行聯(lián)行號,顯示前兩位,其他用星號隱藏,每位1個星號<例子:12********>
     */
    @Test
    public void testCnapsCode() {
        System.out.println(SensitiveInfoUtils.cnapsCode("102100029679"));
    }
 
    /**
     * 獲取脫敏json串 <注意:遞歸引用會導(dǎo)致java.lang.StackOverflowError>
     */
    @Test
    public void testGetJson() {
//        ThreadPoolExecutor consumeExecutor = new ThreadPoolExecutor(30, 30 + 10, 5, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(30 + 10), new ThreadFactory() {
//            @Override
//            public Thread newThread(Runnable r) {
//                Thread myThread = new Thread(r);
//                myThread.setName("TT");
//                return myThread;
//            }
//        }, new ThreadPoolExecutor.CallerRunsPolicy());
//        while (true) {
//            consumeExecutor.execute(new Runnable() {
//                @Override
//                public void run() {}
//            });
//        }
 
        JavaBeanA a1 = new JavaBeanA("","");
        JavaBeanA a2 = new JavaBeanA("","");
        JavaBeanB b1 = new JavaBeanB();
        a1.setB(b1);
//        a1.setDate(new Date());
        
        List<JavaBeanB> a1l = new ArrayList<JavaBeanB>();
        a1l.add(b1);
        a1.setList(a1l);
        Map<String, JavaBeanB> a1m = new HashMap<String, JavaBeanB>();
        a1m.put("b1", b1);
        a1.setMap(a1m);
 
        b1.setA(a2);
        Set<JavaBeanA> b1l = new HashSet<JavaBeanA>();
        b1.setList(b1l);
        Map<String, JavaBeanA> b1m = new HashMap<String, JavaBeanA>();
        b1m.put("a2", a2);
        b1.setMap(b1m);
        long t = System.currentTimeMillis();
        System.out.println(t);
        System.out.println(SensitiveInfoUtils.getJson(a1));
        System.out.println(System.currentTimeMillis()-t);
        System.out.println(JSON.toJSON(a1));
        System.out.println(System.currentTimeMillis()-t);
    
    }
}

測試結(jié)果:

李**
李*
***************8711
*******2277
137****6578
北京朝陽區(qū)酒仙橋中路26號********
6*******@qq.com
622848*********0018
10**********
1443435915750
{"b":{"a":{"b":null,"date":null,"list":[],"map":null,"name":"A**"},"list":[],"map":{"a2":{"b":null,"date":null,"list":[],"map":null,"name":"A**"}},"name":"B**"},"date":null,"list":[{"a":{"b":null,"date":null,"list":[],"map":null,"name":"A**"},"list":[],"map":{"a2":{"b":null,"date":null,"list":[],"map":null,"name":"A**"}},"name":"B**"}],"map":{"b1":{"a":{"b":null,"date":null,"list":[],"map":null,"name":"A**"},"list":[],"map":{"a2":{"b":null,"date":null,"list":[],"map":null,"name":"A**"}},"name":"B**"}},"name":"A**"}
289
{"b":{"a":{"name":"A先生"},"list":[],"map":{"a2":{"name":"A先生"}},"name":"B先生"},"list":[{"a":{"name":"A先生"},"list":[],"map":{"a2":{"name":"A先生"}},"name":"B先生"}],"map":{"b1":{"a":{"name":"A先生"},"list":[],"map":{"a2":{"name":"A先生"}},"name":"B先生"}},"name":"A先生"}
300

使用了google 的API,可以使用maven在添加,配置如下:

<!-- gson -->
  <dependency>
   <groupId>com.google.code.gson</groupId>
   <artifactId>gson</artifactId>
  </dependency>

說明:在需要脫敏的字段上使用定義好的注解,在具體的使用時用SensitiveInfoUtils.getJson(a1),如果不需要脫敏的輸出,盡量不要打印JSON,使用對象的toString()輸出。效率更高。

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

相關(guān)文章

  • SpringMVC如何正確接收時間的請求示例分析

    SpringMVC如何正確接收時間的請求示例分析

    這篇文章主要為大家介紹了SpringMVC如何正確接收時間的請求示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • HttpsURLConnection上傳文件流(實例講解)

    HttpsURLConnection上傳文件流(實例講解)

    下面小編就為大家?guī)硪黄狧ttpsURLConnection上傳文件流(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 淺析java中的取整(/)和求余(%)

    淺析java中的取整(/)和求余(%)

    這篇文章主要介紹了淺析java中的取整(/)和求余(%),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 詳解Spring注解 @Configuration

    詳解Spring注解 @Configuration

    @Configuration 是 Spring 中的一個注解,它用于標記一個類為配置類,通過配置類可以定義和組裝 Spring Bean,并且支持高度靈活的配置方式。本問詳細介紹了Spring注解 @Configuration,感興趣的小伙伴可以參考一下
    2023-04-04
  • mybatis-plus 判斷isnull or的操作

    mybatis-plus 判斷isnull or的操作

    這篇文章主要介紹了mybatis-plus 判斷isnull or的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 解決@PathVariable參數(shù)接收不完整的問題

    解決@PathVariable參數(shù)接收不完整的問題

    這篇文章主要介紹了解決@PathVariable參數(shù)接收不完整的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java與php的區(qū)別淺析

    java與php的區(qū)別淺析

    在本篇文章里小編給大家整理了關(guān)于java與php的區(qū)別以及相關(guān)知識點,有興趣的朋友們學(xué)習(xí)下。
    2019-03-03
  • spring啟動錯誤Singleton bean creation not allowed while the singletons of this factory are indestruction

    spring啟動錯誤Singleton bean creation not al

    本文主要介紹了spring啟動錯誤Singleton bean creation not allowed while the singletons of this factory are indestruction,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • SpringCloud的Config配置中心詳解

    SpringCloud的Config配置中心詳解

    這篇文章主要介紹了SpringCloud的Config配置中心詳解,SpringCloud Config為微服務(wù)架構(gòu)中的微服務(wù)提供集中化的外部配置支持,配置服務(wù)器為各個不同微服務(wù)應(yīng)用的所有環(huán)境提供了一個中心化的外部配置,需要的朋友可以參考下
    2023-07-07
  • JavaFX實現(xiàn)簡單日歷效果

    JavaFX實現(xiàn)簡單日歷效果

    這篇文章主要為大家詳細介紹了JavaFX實現(xiàn)簡單日歷效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11

最新評論