我想实现自定义注解脱敏 新增和查看 都是正常的 有办法执行update操作的时候 也对新内容进行加密么
这里修改失败是因为 修改操作并没有传原本的实体类 然后就判断不到有没有注解 这样么?
我想实现自定义注解脱敏 新增和查看 都是正常的 有办法执行update操作的时候 也对新内容进行加密么
这里修改失败是因为 修改操作并没有传原本的实体类 然后就判断不到有没有注解 这样么?
如果要在执行update操作时对新内容进行加密,需要将原本的实体类传给拦截器。代码中的参数传递是从Invocation.getArgs()[1]获取的,而这里的参数是不包含原本的实体类的,因此导致了加密失败。为了解决这个问题,需要将原本的实体类也传给拦截器。希望对一些敏感数据进行脱敏,比如在执行update操作时也对数据进行加密。
关于如何实现这个需求,可以参考以下步骤:
定义一个自定义注解,用来标识需要脱敏的字段,例如@SensitiveField注解。
在你的代码中使用该注解,标识需要脱敏的字段,例如:
public class User {
@SensitiveField
private String password;
// ...
}
编写一个拦截器,在Mybatis执行update操作之前,拦截请求,并对数据进行脱敏操作,例如:
public Object intercept(Invocation invocation) throws Throwable {
// 获取 MappedStatement
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
// 获取 SQL 命令类型
SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
// 获取参数
Object parameter = invocation.getArgs()[1];
// 只对 update 操作进行处理
if (SqlCommandType.UPDATE.equals(sqlCommandType)) {
// 获取参数中的所有字段
Field[] declaredFields = parameter.getClass().getDeclaredFields();
// 遍历字段,如果该字段使用了@SensitiveField注解,则对该字段的值进行脱敏
for (Field field : declaredFields) {
if (field.isAnnotationPresent(SensitiveField.class)) {
field.setAccessible(true);
Object value = field.get(parameter);
// ... 对值进行脱敏操作
field.set(parameter, 脱敏后的值);
}
}
}
// 继续执行 update