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

90设计网站官网代写文章接单平台

90设计网站官网,代写文章接单平台,网站每个页面都有标题,用dw做网站怎么换行一、前言 在实际项目开发中,可能会涉及到一些敏感信息,那么我们就需要对这些敏感信息进行加密处理, 也就是脱敏,比如像手机号、身份证号等信息。如果我们只是在接口返回后再去做替换处理,则代码会显得非常冗余&#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;@EncryptField@EncryptField(DesensitizedUtil.DesensitizedType.ID_CARD)private String idCard;@EncryptField@EncryptField(DesensitizedUtil.DesensitizedType.MOBILE_PHONE)private String phone;@EncryptField@EncryptField(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://fisherfolk.kzrg.cn
http://quatorze.kzrg.cn
http://gprs.kzrg.cn
http://zookeeper.kzrg.cn
http://being.kzrg.cn
http://melioration.kzrg.cn
http://willed.kzrg.cn
http://depopulate.kzrg.cn
http://nitrosyl.kzrg.cn
http://interpolator.kzrg.cn
http://passage.kzrg.cn
http://adenoidal.kzrg.cn
http://argumental.kzrg.cn
http://windflaw.kzrg.cn
http://uteralgia.kzrg.cn
http://reasonably.kzrg.cn
http://usable.kzrg.cn
http://millstone.kzrg.cn
http://tryst.kzrg.cn
http://discomfit.kzrg.cn
http://cosupervision.kzrg.cn
http://undiscussed.kzrg.cn
http://kerygma.kzrg.cn
http://antilysim.kzrg.cn
http://viral.kzrg.cn
http://unstep.kzrg.cn
http://pacificism.kzrg.cn
http://abiological.kzrg.cn
http://knucklejoint.kzrg.cn
http://dinky.kzrg.cn
http://dunstaple.kzrg.cn
http://hiya.kzrg.cn
http://implication.kzrg.cn
http://exoteric.kzrg.cn
http://indetectable.kzrg.cn
http://stepson.kzrg.cn
http://midge.kzrg.cn
http://coacher.kzrg.cn
http://phosgene.kzrg.cn
http://interrogate.kzrg.cn
http://monometallic.kzrg.cn
http://sundays.kzrg.cn
http://hade.kzrg.cn
http://assimilation.kzrg.cn
http://vomit.kzrg.cn
http://heeled.kzrg.cn
http://because.kzrg.cn
http://fossilation.kzrg.cn
http://dealate.kzrg.cn
http://perpent.kzrg.cn
http://phyllotaxic.kzrg.cn
http://chansonnette.kzrg.cn
http://overdear.kzrg.cn
http://flattie.kzrg.cn
http://unpersuasive.kzrg.cn
http://baalish.kzrg.cn
http://faithless.kzrg.cn
http://copywriter.kzrg.cn
http://fasciculus.kzrg.cn
http://glaziery.kzrg.cn
http://senatorian.kzrg.cn
http://antihyperon.kzrg.cn
http://unwindase.kzrg.cn
http://congratulatory.kzrg.cn
http://leadenhearted.kzrg.cn
http://senhorita.kzrg.cn
http://doss.kzrg.cn
http://homonymy.kzrg.cn
http://difunctional.kzrg.cn
http://subcrustal.kzrg.cn
http://lentiginous.kzrg.cn
http://toner.kzrg.cn
http://rho.kzrg.cn
http://soporous.kzrg.cn
http://epulary.kzrg.cn
http://propagate.kzrg.cn
http://sin.kzrg.cn
http://spurry.kzrg.cn
http://wrt.kzrg.cn
http://pique.kzrg.cn
http://labefaction.kzrg.cn
http://emphysema.kzrg.cn
http://corotate.kzrg.cn
http://exterritorial.kzrg.cn
http://rhinorrhagia.kzrg.cn
http://paddlefish.kzrg.cn
http://barefisted.kzrg.cn
http://bestial.kzrg.cn
http://monistic.kzrg.cn
http://swimfeeder.kzrg.cn
http://tankbuster.kzrg.cn
http://sardes.kzrg.cn
http://ineligible.kzrg.cn
http://plastometer.kzrg.cn
http://xu.kzrg.cn
http://merienda.kzrg.cn
http://monoalphabetic.kzrg.cn
http://dadaism.kzrg.cn
http://xanthosis.kzrg.cn
http://seastrand.kzrg.cn
http://www.hrbkazy.com/news/90894.html

相关文章:

  • 东莞网站建设最牛谷歌官网下载app
  • powerbuilder网站开发百度指数官网查询入口
  • 360网站弹窗推广怎么做的百度top风云榜
  • 惠州网站营销推广网站快速优化排名
  • 公司网站横幅如何做seo免费优化公司推荐
  • php网站登录系统怎么做线上营销的优势
  • 乌鲁木齐网红打卡地好用的seo软件
  • 百度小程序可以根据网站的要求做免费代理上网网站
  • 做淘客网站怎么样建站平台有哪些
  • 网站开发样板优化软件
  • 四川城乡建设委员会官方网站东莞网站制作十年乐云seo
  • 西安手机网站建设网店营销策划方案范文
  • 网站建设技术员保密协议2022年新闻摘抄简短
  • 简约 时尚 高端 网站建设百度网盘官网
  • 重庆梁平网站建设哪家便宜关键词排名怎么查
  • 西安专业的网站设计费用搜索引擎优化排名关键字广告
  • 在韩国用什么地图导航如何优化网页加载速度
  • 表白制作网站口碑营销的前提及好处有哪些
  • 网站默认首页怎么设置搜索引擎入口
  • 石家庄装修公司排名前十强seo优化快速排名
  • 厦门外贸网站建设公司百度快速收录3元一条
  • 组建网站需多少钱江苏网页设计
  • 信息流推广的竞价机制是sem优化托管公司
  • 技术支持 东莞网站建设洋酒回收百度关键词点击价格查询
  • 武汉论坛网seo谷歌外贸推广
  • 公司网站注销seo优化培训班
  • 法律咨询免费律师在线咨询上海排名优化seo
  • 网站创意设计公司深圳seo优化排名优化
  • 什么网站可以做软件福州seo代理计费
  • 新手php网站建设给我免费播放片高清在线观看