SpringBoot encrypted return value of Json

To return to the front end of the sensitive fields encrypting

Such as phone number, ID number and so on.

Achieve org.springframework.web.method.support.HandlerMethodReturnValueHandler Interface

Implementation class: ResultWarpReturnValueHandler

public class ResultWarpReturnValueHandler implements HandlerMethodReturnValueHandler {

    private final HandlerMethodReturnValueHandler delegate;

    public ResultWarpReturnValueHandler(HandlerMethodReturnValueHandler delegate) {
        this.delegate = delegate;
    }

    @Override
    public boolean supportsReturnType(MethodParameter returnType) {
        return delegate.supportsReturnType(returnType);
    }

    @Override
    public void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
        delegate.handleReturnValue(convertReturnValue(returnType), returnType, mavContainer, webRequest);
    }

    private Object convertReturnValue(Object source) {
        if (null != source) {
            jsonEncrypt(source);
        }
        return source;
    }

    private void jsonEncrypt(Object source) {
        if(source instanceof List) {
            Iterable iterable = (Iterable) source;
            for (Object object : iterable) {
                doJsonEncrypt(object);
            }
        } else if(source instanceof Result) {
            Result<?> result = (Result<?>) source;
            if(null != result.getData()) {
                doJsonEncrypt(result.getData());
            }
        } else {
            doJsonEncrypt(source);
        }
    }

    private void doJsonEncrypt(Object object) {
        Field[] fields = object.getClass().getDeclaredFields();
        if(ArrayUtils.isNotEmpty(fields)) {
            for (Field field : fields) {
                JsonEncrypt jsonEncrypt = field.getAnnotation(JsonEncrypt.class);
                if(null != jsonEncrypt) {
                    doJsonEncrypt(field, jsonEncrypt, object);
                }
            }
        }
    }

    private void doJsonEncrypt(Field field, JsonEncrypt jsonEncrypt, Object object) {
        try {
            field.setAccessible(true);
            Object val = field.get(object);
            IF (null = Val!) { 
                // the encrypted value 
                String String.valueOf strval = (Val); 

                // 加密参数
                String spanChar jsonEncrypt.value = (); 
                int = beginIdx jsonEncrypt.beginIdx (), endIdx jsonEncrypt.endIdx = (); 

                // the encrypted value provided 
                field.set (Object, EncryptViewUtils.toEncryptView (strval, spanChar, beginIdx, endIdx)); 
            } 
        } the catch (IllegalAccessException E) { 
            e.printStackTrace (); 
        } 
    } 
}

  

配置:ReturnValueConfig

@Configuration
public class ReturnValueConfig implements InitializingBean {

    @Autowired
    private RequestMappingHandlerAdapter requestMappingHandlerAdapter;

    @Override
    public void afterPropertiesSet() throws Exception {
        List<HandlerMethodReturnValueHandler> unmodifiableList = requestMappingHandlerAdapter.getReturnValueHandlers();
        List<HandlerMethodReturnValueHandler> list = new ArrayList<>(unmodifiableList.size());
        for (HandlerMethodReturnValueHandler returnValueHandler : unmodifiableList) {
            if (returnValueHandler instanceof RequestResponseBodyMethodProcessor) {
                list.add(new ResultWarpReturnValueHandler(returnValueHandler));
            } else {
                list.add(returnValueHandler);
            }
        }
        requestMappingHandlerAdapter.setReturnValueHandlers(list);
    }
}

  

Method handleReturnValue class ResultWarpReturnValueHandler the inside, returnValue parameter is returned object.

Business Notes:

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface JsonEncrypt {

    public String value() default "*";

    public int beginIdx() default 0;

    public int endIdx() default 0;
}

  

User class:

// ID number 
@JsonEncrypt (= beginIdx. 4, 13 is endIdx =) 
Private String idCard;

 

Encryption processing categories:

{class EncryptViewUtils public 

    / ** 
     * String Encryption 
     * 
     * @param strval string 
     * @param spanChar encrypted character 
     * @param beginIdx begin subscript 
     superscript * @param endIdx end 
     string of encrypted * @return 
     * / 
    public static toEncryptView String (strval String, String spanChar, beginIdx int, int endIdx) { 
        // not empty 
        IF (StringUtils.isNotEmpty (strval)) { 
            // index correction start moving problem 
            IF (beginIdx <0) { 
                beginIdx = 0; 
            } 
            question mark at the end of the displacement correction @ 
            IF (endIdx> strVal.length ()) { 
                endIdx = strVal.length () -. 1; 
            } 
            at the end of the // process starts subscript index below problem
            if(beginIdx > endIdx) {
                endIdx = beginIdx;
            }
            StringBuilder builder = new StringBuilder();
            // 如果结束下标是0
            if (endIdx == 0) {
                builder.append(spanChar);
            } else {
                // 循环处理加密字符
                char[] chars = strVal.toCharArray();
                for (int i = 0; i < chars.length; i++) {
                    if (i >= beginIdx && i <= endIdx) {
                        builder.append(spanChar);
                    } else {
                        builder.append(chars[i]);
                    }
                }
            }
            return builder.toString();
        }
        return strVal;
    }

}

  

ID number is displayed in the front

{
	"idCard": "1308**********1729"
}

  

Author: Se7end

Disclaimer: This article is the original blog, I have summarized represent a certain time at work learning the views or conclusions. Give the original link in the apparent position of the article page reprint.

Guess you like

Origin www.cnblogs.com/se7end/p/11325266.html