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

电子商务设计网站建设长春百度网站快速优化

电子商务设计网站建设,长春百度网站快速优化,哈尔滨建站怎么做,全免费的传奇手游一、前言 在实际项目开发中#xff0c;可能会涉及到一些敏感信息#xff0c;那么我们就需要对这些敏感信息进行加密处理#xff0c; 也就是脱敏#xff0c;比如像手机号、身份证号等信息。如果我们只是在接口返回后再去做替换处理#xff0c;则代码会显得非常冗余#xf…一、前言 在实际项目开发中可能会涉及到一些敏感信息那么我们就需要对这些敏感信息进行加密处理 也就是脱敏比如像手机号、身份证号等信息。如果我们只是在接口返回后再去做替换处理则代码会显得非常冗余那么实际可以通过注解的方式实现数据脱敏。 二、具体实现 1.定义一个标记于方法上的注解。 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(ElementType.METHOD) //METHOD 说明该注解只能用在方法上 Retention(RetentionPolicy.RUNTIME) //RUNTIME 说明该注解在运行时生效 public interface DataEncryption {} 2.定义一个数据解密的注解。 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(ElementType.METHOD) //METHOD 说明该注解只能用在方法上 Retention(RetentionPolicy.RUNTIME) //RUNTIME 说明该注解在运行时生效 public interface DataDecryption {}3.定义一个在字段上且有值的注解。 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(ElementType.FIELD) //FIELD 说明该注解只能用在字段上 Retention(RetentionPolicy.RUNTIME) //RUNTIME 说明该注解在运行时生效 public interface EncryptField {//脱敏枚举值DesensitizationEnum value(); } 4.定义一个在字段上且有值的注解。 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(ElementType.FIELD) //FIELD 说明该注解只能用在字段上 Retention(RetentionPolicy.RUNTIME) //RUNTIME 说明该注解在运行时生效 public interface DecryptField {//脱敏枚举值DesensitizedUtil.DesensitizedType value(); }5.定义用户返回的实体类。 import com.test.annotation.DecryptField; import com.test.enums.DesensitizationEnum; import com.test.utils.AesUtil;import java.lang.reflect.Field; import lombok.Data; // 用户信息返回实体类 Data public class UserResVo {DecryptField(DesensitizedUtil.DesensitizedType.CHINESE_NAME)EncryptFieldprivate String name;EncryptFieldEncryptField(DesensitizedUtil.DesensitizedType.ID_CARD)private String idCard;EncryptFieldEncryptField(DesensitizedUtil.DesensitizedType.MOBILE_PHONE)private String phone;EncryptFieldEncryptField(DesensitizedUtil.DesensitizedType.EMAIL)private String email; } 6.定义AOP注解实现 import cn.hutool.crypto.digest.DigestUtil; import com.google.gson.Gson; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.lang.reflect.Field; import java.util.Objects;Aspect Component Slf4j public class SecretAopAspect {Pointcut(annotation(com.secret.annotation.DataEncryption))public void encryptAopCut() {}Pointcut(annotation(com.secret.annotation.DataDecryption))public void decryptAopCut() {}/*** method encryptMethodAop* desc 加密方法* Param: joinPoint*/Around(encryptAopCut())public Object encryptMethodAop(ProceedingJoinPoint joinPoint) {Object responseObj null;try {responseObj joinPoint.proceed();this.handleEncrypt(responseObj);//md5加密在相应里面设置签名值String md5Data DigestUtil.md5Hex(new Gson().toJson(responseObj));HttpServletResponse response ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();response.setHeader(md5,md5Data);} catch (Throwable throwable) {throwable.printStackTrace();this.log.error(encryptMethodAop处理出现异常{}, throwable);}return responseObj;}/*** method decryptMethodAop* desc 解密方法* Param: joinPoint*/Around(decryptAopCut())public Object decryptMethodAop(ProceedingJoinPoint joinPoint) {Object responseObj null;try {responseObj joinPoint.getArgs()[0];//throw new RuntimeException(md5校验失败);this.handleDecrypt(responseObj);//生成md5签名String md5 DigestUtil.md5Hex(new Gson().toJson(responseObj));System.out.println(md5);//从请求头获取前端传过来的签名String origianlMd5 ;HttpServletRequest request ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();origianlMd5 request.getHeader(md5);//比对签名if(md5.equals(origianlMd5)){//方便调试不比对前端签名responseObj joinPoint.proceed();}else{throw new Exception(参数的md5校验不同可能存在篡改行为请检查);}} catch (Throwable throwable) {throwable.printStackTrace();log.error(decryptMethodAop处理出现异常{}, throwable);}return responseObj;}/*** method handleEncrypt* desc 对实体么个属性进行加密* Param: requestObj* return void*/private void handleEncrypt(Object requestObj) throws Exception {if (!Objects.isNull(requestObj)) {Field[] fields requestObj.getClass().getDeclaredFields();Field[] fieldsCopy fields;int fieldLength fields.length;for(int i 0; i fieldLength; i) {Field field fieldsCopy[i];boolean hasSecureField field.isAnnotationPresent(EncryptField.class);if (hasSecureField) {field.setAccessible(true);String plaintextValue (String)field.get(requestObj);String cipherText AesUtil.encrypt(plaintextValue);field.set(requestObj, cipherText);}}}}/*** method handleDecrypt* desc 对实体么个属性进行解密* Param: responseObj* return*/private Object handleDecrypt(Object responseObj) throws Exception {if (Objects.isNull(responseObj)) {return null;} else {Field[] fields responseObj.getClass().getDeclaredFields();Field[] fieldsCopy fields;int fieldLength fields.length;for(int i 0; i fieldLength; i) {Field field fieldsCopy[i];boolean hasSecureField field.isAnnotationPresent(DecryptField.class);if (hasSecureField) {DecryptField decryptField field.getAnnotation(DecryptField.class);field.setAccessible(true);String encryptValue (String)field.get(responseObj);encryptValue AesUtil.decrypt(encryptValue,decryptField.getValue());field.set(responseObj, encryptValue);}}return responseObj;}}}7.加解密工具类 import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.DesensitizedUtil; import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.symmetric.AES;public class AesUtil {// 默认16位 或 128 256位public static String AES_KEY EN#qerdfdshbd110;public static AES aes SecureUtil.aes(AES_KEY.getBytes());public static String encrypt(Object obj) {return aes.encryptHex((String) obj);}public static String decrypt(Object obj, DesensitizedUtil.DesensitizedType desensitizedType) {// 解密String decrypt decrypt(obj);// 脱敏return DesensitizedUtil.desensitized(decrypt, desensitizedType);}public static String decrypt(Object obj) {return aes.decryptStr((String) obj, CharsetUtil.CHARSET_UTF_8);} }8.接着就可以测试了。
http://www.w-s-a.com/news/821211/

相关文章:

  • 淘宝不能发布网站源码做商品怀化网站制作建设
  • 买空间哪个网站好做我的世界背景图的网站
  • 南京哪里做网站wordpress 增加子目录
  • 刚做的网站搜全名查不到网站很难被百度收录
  • 网站建设与管理期末做网站买空间用共享ip
  • 网络合同怎么签有效南京seo公司哪家
  • 厦门建设网官方网站上海网络网站建
  • 网站制作西安郑州网站建设动态
  • 外贸网站免费推广温州做网站技术员
  • 武冈 网站建设做网站能收回吗
  • 网站做前端把网站扒下来以后怎么做
  • 网站模板素材下载手机做任务佣金的网站
  • 机关网站建设考核测评总结做网站sqlserver排序
  • 凉山州建设厅官方网站html5下载教程
  • 内网网站建设方面政策id97网站怎么做的
  • 福州企业建站系统七米网站建设
  • 长春seo建站北京做机床的公司网站
  • 网站维护具体做啥如何开发wap网站
  • 公司网站设计费计入什么科目潍坊公司网站制作
  • 拖拽式网站开发模具钢东莞网站建设
  • 彩票娱乐网站建设模块化网站开发
  • 孝感网站设计用自己的名字设计头像
  • 高明网站建设哪家好深圳vi设计公司全力设计
  • 工程技术cpu游戏优化加速软件
  • 一起做网店网站入驻收费wordpress 自定义评论样式
  • 深圳高端网站建设公司排名app软件开发sh365
  • 泰州网站整站优化惠州做网站多少钱
  • 做博客网站的php代码一建论坛建工教育网
  • 邢台网站制作费用单页营销网站后台
  • 红色网站建设的比较好的高校用vs2010做购物网站