springboot出参脱敏
时间: 2025-01-03 19:29:11 浏览: 4
### Spring Boot 输出参数脱敏处理实现方法
在构建 RESTful API 或者其他类型的接口时,数据的安全性和隐私保护至关重要。对于敏感信息如身份证号、手机号码等,在返回给客户端之前应该进行必要的脱敏操作。
一种常见的做法是在实体类中定义自定义注解来标记哪些字段需要被隐藏部分字符显示[^1]。例如:
```java
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Desensitized {
String type() default "";
}
```
接着创建一个处理器用于拦截响应对象并替换指定属性的内容为模糊化后的版本[^2]。下面是一个简单的例子展示如何通过 AOP 切面编程技术完成此功能:
```java
@Component
@Aspect
@Slf4j
public class ResponseDesensitizeInterceptor {
@Around("@annotation(org.springframework.web.bind.annotation.GetMapping)")
public Object around(ProceedingJoinPoint point) throws Throwable {
try {
Object result = point.proceed();
if (result instanceof List<?>) {
((List<?>) result).forEach(item -> handleObjectFields(item));
} else {
handleObjectFields(result);
}
return result;
} catch (Throwable e) {
log.error("Error occurred while processing response", e);
throw e;
}
}
private void handleObjectFields(Object object){
Class<?> clazz = object.getClass();
Field[] fields = clazz.getDeclaredFields();
for(Field field : fields){
boolean accessible = field.isAccessible();
field.setAccessible(true);
Desensitized annotation = field.getAnnotation(Desensitized.class);
if(annotation != null && !Objects.isNull(field.get(object))){
String value = Objects.toString(field.get(object), "");
switch (annotation.type()){
case "phone":
field.set(object, hidePhone(value));
break;
// Add more cases as needed...
}
}
field.setAccessible(accessible);
}
}
private String hidePhone(String phoneNum){
int length = Math.min(phoneNum.length(), 7);
StringBuilder sb = new StringBuilder(length + 4);
sb.append(phoneNum.substring(0, 3)).append("****").append(phoneNum.substring(7));
return sb.toString();
}
}
```
上述代码片段展示了如何利用 AspectJ 和反射机制遍历目标对象及其内部集合中的每一个元素,并针对带有 `@Desensitized` 注解的字符串型成员变量执行特定模式下的遮蔽逻辑[^3]。
阅读全文