在开发SpringMV项目的时候,需要对数据库的部分字段进行加密处理,解密写在find方法里:
@Override
@Transactional(readOnly = true)
public Qydjxx find(String id) {
Qydjxx qydjxx =super.find(id);//查询获得数据库信息
qydjxx =decryptionService.decryptforQydjxx( qydjxx );//解密的方法
return qydjxx ;
}
其中decryptforQydjxx为解密的方法,将解密之后的值赋值给对象,没有进行save和update的操作,数据库的数据却变成了解密的数据。这个是犹豫持久化造成了。要将对象的持久化改成游离状态;
@PersistenceContext
private EntityManager entityManger;
@Override
public Qydjxxweb decryptforQydjxxweb(Qydjxxweb obj) {
if (null != obj) {
// 获得hibernate的session管理对象
HibernateEntityManager hEntityManager = (HibernateEntityManager)entityManager;
Session session = hEntityManager.getSession();
// 将该对象从持久态变为游离态,一定要先变成游离态再赋值,不然报错
session.evict(obj);
。。。。。。。。。。。。//省略部分代码
if (null != colmnamelist && StringUtils.isNotBlank(tableName) && StringUtils.isNotBlank(p_key_value)) {
if (colmnamelist.size() > 0) {
for (String colname : colmnamelist) {
colname_value = getFieldValueByFieldName(colname, obj);
if (StringUtils.isNotBlank(colname_value)) {
colname_en = getFieldValueByFieldName(colname + "_en", obj);
if (StringUtils.isNotBlank(colname_en)) {
if ("1".equals(colname_en)&&colname_value.length()==172) {// 状态未1,表示加密,加密才能解密
privateKey = repository.findbyColnameAndtablename(tableName, colname, p_key_value);// 获取私钥
if (StringUtils.isNotBlank(privateKey)) {
decrypt_value = decrypt(colname_value, privateKey);
if (StringUtils.isNotBlank(decrypt_value)) {
// 赋值,bean,字段,解密之后的值
if("linkman_cardid".equals(colname)) {
obj.setLinkman_cardid(decrypt_value);
continue;
}else if("linkman_mobile".equals(colname)){
obj.setLinkman_mobile(decrypt_value);
continue;
}else if("linkman_email".equals(colname)){
obj.setLinkman_email(decrypt_value);
continue;
}else if("legal_representative_cardid".equals(colname)){
obj.setLegal_representative_cardid(decrypt_value);
continue;
}
}
}
}
}
}
}
}
}
}
return obj;
}