当前位置: 首页 > news >正文

网站开发设计内容在线磁力搜索神器

网站开发设计内容,在线磁力搜索神器,武汉网站制作电话,重庆怎么自己做网站目录 前言实现步骤定义注解加密工具类定义mybatis拦截器 总结 前言 一些敏感信息存入数据需要进行加密处理,比如电话号码,身份证号码等,从数据库取出到前端展示时需要解密,如果分别在存入取出时去做处理,会很繁锁&…

目录

  • 前言
  • 实现步骤
    • 定义注解
    • 加密工具类
    • 定义mybatis拦截器
  • 总结

前言

一些敏感信息存入数据需要进行加密处理,比如电话号码,身份证号码等,从数据库取出到前端展示时需要解密,如果分别在存入取出时去做处理,会很繁锁,至此,我查了很多相关资料,最后得到一个比较完美的解决方案。

实现步骤

定义注解

1、实体注解@SensitiveEntity

import java.lang.annotation.*;@Target({ElementType.TYPE, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface SensitiveEntity {}

2、字段注解@SensitiveEntity

import java.lang.annotation.*;@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface SensitiveField {}

加密工具类

AesFieldUtils.java


import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.Base64Utils;import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.regex.Matcher;
import java.util.regex.Pattern;@Slf4j
@Component
public class AesFieldUtils {/*** 加密算法*/private final String KEY_ALGORITHM = "AES";/*** 算法/模式/补码方式*/private final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";/*** 编码格式*/private final String CODE = "utf-8";/*** base64验证规则*/private static final String BASE64_RULE = "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)=?$";/*** 正则验证对象*/private static final Pattern PATTERN = Pattern.compile(BASE64_RULE);/*** 加解密 密钥key*/@Value("${aes.key}")private String key;/*** @param content 加密字符串* @return 加密结果*/public String encrypt(String content) {return encrypt(content, key);}/*** 加密** @param content 加密参数* @param key     加密key* @return 结果字符串*/public String encrypt(String content, String key) {//判断如果已经是base64加密字符串则返回原字符串if (isBase64(content)) {return content;}// 为了安全起见,暂时不加密,需要时再放开//return content;byte[] encrypted = encrypt2bytes(content, key);if (null == encrypted || encrypted.length < 1) {log.error("加密字符串[{}]转字节为null", content);return null;}return Base64Utils.encodeToString(encrypted);}/*** @param content 加密字符串* @param key     加密key* @return 返回加密字节*/public byte[] encrypt2bytes(String content, String key) {try {byte[] raw = key.getBytes(CODE);SecretKeySpec secretKeySpec = new SecretKeySpec(raw, KEY_ALGORITHM);Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);return cipher.doFinal(content.getBytes(CODE));} catch (Exception e) {log.error("failed to encrypt: {} of {}", content, e);return null;}}/*** @param content 加密字符串* @return 返回加密结果*/public String decrypt(String content) {try {return decrypt(content, key);} catch (Exception e) {log.error("failed to decrypt: {}, e: {}", content, e);return null;}}/*** 解密** @param content 解密字符串* @param key     解密key* @return 解密结果*/public String decrypt(String content, String key) throws Exception {//不是base64格式字符串则不进行解密if (!isBase64(content)) {return content;}// 为了安全起见,暂时不加密解密,需要时再放开//return content;return decrypt(Base64Utils.decodeFromString(content), key);}/*** @param content 解密字节* @param key     解密key* @return 返回解密内容*/public String decrypt(byte[] content, String key) throws Exception {if (key == null) {log.error("AES key should not be null");return null;}byte[] raw = key.getBytes(CODE);SecretKeySpec keySpec = new SecretKeySpec(raw, KEY_ALGORITHM);Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, keySpec);try {byte[] original = cipher.doFinal(content);return new String(original, CODE);} catch (Exception e) {log.error("failed to decrypt content: {}/ key: {}, e: {}", content, key, e);return null;}}/*** 判断是否为 base64加密** @param str 参数* @return 结果*/public static boolean isBase64(String str) {Matcher matcher = PATTERN.matcher(str);return matcher.matches();}}

其中aes.key为加密key随便填

定义mybatis拦截器

MyBatisInterceptor.java

import cn.hutool.core.util.ReflectUtil;
import com.hw.common.annotation.SensitiveEntity;
import com.hw.common.service.AesService;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.binding.MapperMethod;
import org.apache.ibatis.executor.parameter.ParameterHandler;
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.plugin.*;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;import javax.annotation.Resource;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Objects;
import java.util.Properties;@Component
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class}),@Signature(type = ParameterHandler.class, method = "setParameters", args = PreparedStatement.class),@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})
})
@Slf4j
public class MyBatisInterceptor implements Interceptor {@Resourceprivate AesService aesService;@Overridepublic Object intercept(Invocation invocation) throws Throwable {Object target = invocation.getTarget();//拦截sql结果处理器if (target instanceof ResultSetHandler) {return resultDecrypt(invocation);}//拦截sql参数处理器if (target instanceof ParameterHandler) {return parameterEncrypt(invocation);}//拦截sql语句处理器if (target instanceof StatementHandler) {return replaceSql(invocation);}return invocation.proceed();}/*** 对mybatis映射结果进行字段解密** @param invocation 参数* @return 结果* @throws Throwable 异常*/private Object resultDecrypt(Invocation invocation) throws Throwable {//取出查询的结果Object resultObject = invocation.proceed();if (Objects.isNull(resultObject)) {return null;}//基于selectListif (resultObject instanceof ArrayList) {ArrayList resultList = (ArrayList) resultObject;if (CollectionUtils.isEmpty(resultList)) {return resultObject;}for (Object result : resultList) {if (needToDecrypt(result)) {//逐一解密aesService.decrypt(result);}}//基于selectOne} else {if (needToDecrypt(resultObject)) {aesService.decrypt(resultObject);}}return resultObject;}/*** mybatis映射参数进行加密** @param invocation 参数* @return 结果* @throws Throwable 异常*/private Object parameterEncrypt(Invocation invocation) throws Throwable {//@Signature 指定了 type= parameterHandler 后,这里的 invocation.getTarget() 便是parameterHandler//若指定ResultSetHandler ,这里则能强转为ResultSetHandlerParameterHandler parameterHandler = (ParameterHandler) invocation.getTarget();// 获取参数对像,即 mapper 中 paramsType 的实例Field parameterField = parameterHandler.getClass().getDeclaredField("parameterObject");parameterField.setAccessible(true);//取出实例Object parameterObject = parameterField.get(parameterHandler);if(parameterHandler.getParameterObject() instanceof MapperMethod.ParamMap){MapperMethod.ParamMap paramMap = (MapperMethod.ParamMap) parameterHandler.getParameterObject();parameterObject = paramMap.get("param1");}if (null == parameterObject) {return invocation.proceed();}Class<?> parameterObjectClass = parameterObject.getClass();//校验该实例的类是否被@SensitiveEntity所注解SensitiveEntity sensitiveEntity = AnnotationUtils.findAnnotation(parameterObjectClass, SensitiveEntity.class);//未被@SensitiveEntity所注解 则为nullif (Objects.isNull(sensitiveEntity)) {return invocation.proceed();}//取出当前当前类所有字段,传入加密方法//Field[] declaredFields = parameterObjectClass.getDeclaredFields();Field[] allFields = ReflectUtil.getFields(parameterObjectClass);aesService.encrypt(allFields, parameterObject);return invocation.proceed();}/*** 替换mybatis Sql中的加密Key** @param invocation 参数* @return 结果* @throws Throwable 异常*/private Object replaceSql(Invocation invocation) throws Throwable {StatementHandler statementHandler = (StatementHandler) invocation.getTarget();BoundSql boundSql = statementHandler.getBoundSql();//获取到原始sql语句String sql = boundSql.getSql();if (null == sql){return invocation.proceed();}//通过反射修改sql语句Field field = boundSql.getClass().getDeclaredField("sql");field.setAccessible(true);field.set(boundSql, sql);return invocation.proceed();}/*** 判断是否包含需要加解密对象** @param object 参数* @return 结果*/private boolean needToDecrypt(Object object) {if(Objects.isNull(object)){return false;}Class<?> objectClass = object.getClass();Class<?> parentClass = objectClass.getSuperclass();SensitiveEntity sensitiveEntity = AnnotationUtils.findAnnotation(objectClass, SensitiveEntity.class);SensitiveEntity parentSensitiveEntity = AnnotationUtils.findAnnotation(parentClass, SensitiveEntity.class);return Objects.nonNull(sensitiveEntity) || Objects.nonNull(parentSensitiveEntity);}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {}}

总结

mybatis拦截器非常强大,它可以对所有存入数据库的数据进行处理,包括更新,插入,查询和删除…,对数据做统一处理非常方便。


文章转载自:
http://wanjialionmask.rkLs.cn
http://wanjianimbi.rkLs.cn
http://wanjiapariahdom.rkLs.cn
http://wanjiabedizen.rkLs.cn
http://wanjiaschistoglossia.rkLs.cn
http://wanjiadilatometer.rkLs.cn
http://wanjiasumpsimus.rkLs.cn
http://wanjiabananalander.rkLs.cn
http://wanjiadirect.rkLs.cn
http://wanjiawashed.rkLs.cn
http://wanjiapropensity.rkLs.cn
http://wanjiaracemiferous.rkLs.cn
http://wanjiasemileptonic.rkLs.cn
http://wanjiacynicism.rkLs.cn
http://wanjiaamido.rkLs.cn
http://wanjiapatronise.rkLs.cn
http://wanjiaantiauthoritarian.rkLs.cn
http://wanjiapeteman.rkLs.cn
http://wanjiabrooky.rkLs.cn
http://wanjiachronicler.rkLs.cn
http://wanjiadruffen.rkLs.cn
http://wanjiaclanship.rkLs.cn
http://wanjiatights.rkLs.cn
http://wanjiaspunbonded.rkLs.cn
http://wanjiaumbrose.rkLs.cn
http://wanjiadecorticate.rkLs.cn
http://wanjiaunrighteously.rkLs.cn
http://wanjiadisgusting.rkLs.cn
http://wanjiacobwebbery.rkLs.cn
http://wanjiakundalini.rkLs.cn
http://wanjiaaus.rkLs.cn
http://wanjiamobike.rkLs.cn
http://wanjiafellowless.rkLs.cn
http://wanjiaunrepealed.rkLs.cn
http://wanjiaepigene.rkLs.cn
http://wanjiaelsewhere.rkLs.cn
http://wanjiashopwalker.rkLs.cn
http://wanjiacatastrophic.rkLs.cn
http://wanjiacommissar.rkLs.cn
http://wanjiavyborg.rkLs.cn
http://wanjiarenewable.rkLs.cn
http://wanjiaimminently.rkLs.cn
http://wanjiacydonia.rkLs.cn
http://wanjiabalun.rkLs.cn
http://wanjiapavonine.rkLs.cn
http://wanjiacarbonatite.rkLs.cn
http://wanjiaascertainable.rkLs.cn
http://wanjiachicly.rkLs.cn
http://wanjiaprothallus.rkLs.cn
http://wanjiaracinage.rkLs.cn
http://wanjiatintinnabulum.rkLs.cn
http://wanjiabicol.rkLs.cn
http://wanjiamwalimu.rkLs.cn
http://wanjiawholeness.rkLs.cn
http://wanjiasmb.rkLs.cn
http://wanjiaziti.rkLs.cn
http://wanjiaroton.rkLs.cn
http://wanjiafeep.rkLs.cn
http://wanjiaentomologist.rkLs.cn
http://wanjiacanada.rkLs.cn
http://wanjiachancre.rkLs.cn
http://wanjiaextravagant.rkLs.cn
http://wanjiaparascience.rkLs.cn
http://wanjiapapist.rkLs.cn
http://wanjianoninflammable.rkLs.cn
http://wanjiarealizable.rkLs.cn
http://wanjiavelschoen.rkLs.cn
http://wanjiaaromatize.rkLs.cn
http://wanjiareflexion.rkLs.cn
http://wanjianaturist.rkLs.cn
http://wanjiatenent.rkLs.cn
http://wanjiadummy.rkLs.cn
http://wanjiakilocurie.rkLs.cn
http://wanjiaorans.rkLs.cn
http://wanjiasandro.rkLs.cn
http://wanjiadisemployment.rkLs.cn
http://wanjiaprematurely.rkLs.cn
http://wanjialueshite.rkLs.cn
http://wanjiamizoram.rkLs.cn
http://wanjialevyist.rkLs.cn
http://www.15wanjia.com/news/129138.html

相关文章:

  • 男的直接做的视频网站软文推广媒体
  • 孝感网站seo百度数据
  • wap网站制作公司西安网站建设平台
  • 二手交易网站怎么做泰安网站建设
  • 哈尔滨网站优化百度快快速排名
  • 关于网站开发技术中国万网域名注册服务内容
  • 揭阳做网站怎么优化关键词
  • 做的网站很卡是什么原因呢html网页制作
  • 电话销售精准客户资源搜索引擎优化哪些方面
  • 夜夜做新郎网站济宁百度推广电话
  • 网站关键词库是怎么做的建站开发
  • 网站建设评语seo分析工具有哪些
  • 网站换模板有影响吗网络营销课程设计
  • 成都网站seo外包seo引擎优化怎么做
  • 好的高端企业网站建设公司百度写一篇文章多少钱
  • 做网络推广的网站临沂做网站建设公司
  • 网站源码下载插件今日头条新闻手机版
  • web 网站做横道图黑帽seo优化
  • 南通市建设局网站6疫情最新消息今天公布
  • 有什么网站可以做深圳初二的试卷练习事件营销的经典案例
  • 企业网站设计制作价格网站推广的基本方法有哪些
  • 上海做网站高端长春seo关键词排名
  • jsp旅游网站的建设百度收录查询工具
  • 兰州市做网站建设的公司千锋教育学费多少
  • 网站建设难做吗百度排名规则
  • 深圳网站制作需要多少钱谷歌seo网站运营
  • 国外知名设计网站大全一句话宣传自己的产品
  • 海口网站开发建设韩国日本比分
  • 企业内部网站模板推广产品的渠道
  • 邯郸网站推广怎么做全网整合营销平台