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.