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

做网站的岗位好吗四川省住房建设厅官方网站

做网站的岗位好吗,四川省住房建设厅官方网站,任县附近网站建设价格,嘉定华亭网站建设#x1f604; 19年之后由于某些原因断更了三年#xff0c;23年重新扬帆起航#xff0c;推出更多优质博文#xff0c;希望大家多多支持#xff5e; #x1f337; 古之立大事者#xff0c;不惟有超世之才#xff0c;亦必有坚忍不拔之志 #x1f390; 个人CSND主页——Mi… 19年之后由于某些原因断更了三年23年重新扬帆起航推出更多优质博文希望大家多多支持 古之立大事者不惟有超世之才亦必有坚忍不拔之志 个人CSND主页——Micro麦可乐的博客 《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程入门到实战 《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程从基础知识到项目实战 《设计模式》专栏以实际的生活场景为案例进行讲解让大家对设计模式有一个更清晰的理解 《Jenkins实战》专栏主要介绍JenkinsDockerGitMaven的实战教程让你快速掌握项目CI/CD是2024年最新的实战教程 如果文章能够给大家带来一定的帮助欢迎关注、评论互动 Spring Boot中整合Jasypt 使用自定义注解AOP实现敏感字段的加解密 前言开始接入步骤一添加依赖步骤二配置Jasypt步骤三创建自定义注解步骤四创建AOP切面步骤四创建示例实体类步骤五创建测试Controller步骤六验证功能 结语 前言 在博主前面一篇文章中相信小伙伴对 Spring Boot 中整合 Jasypt 以及加解密的方法有了一定的了解没看过的小伙伴可以访问 【Spring Boot整合Jasypt 库实现配置文件和数据库字段敏感数据的加解密】 一起探讨。 本章节我们针对 Jasypt 来做一些升级的玩法使用自定义注解 AOP 来实现敏感字段的加解密。 开始接入 步骤一添加依赖 首先构建我们的 Spring Boot 项目, 引入相关依赖 Jasypt 和 Spring AOP 的依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId /dependency dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactId /dependency dependencygroupIdcom.github.ulisesbocchio/groupIdartifactIdjasypt-spring-boot-starter/artifactIdversion3.0.5/version /dependency步骤二配置Jasypt 这里博主复用了上一篇教程的配置如果你希望更深入的了解 YML配置和各项配置的说明可以访问 【Spring Boot整合Jasypt 库实现配置文件和数据库字段敏感数据的加解密】 import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties; import org.jasypt.encryption.StringEncryptor; import org.jasypt.encryption.pbe.PooledPBEStringEncryptor; import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;Configuration EnableEncryptableProperties public class StringEncryptorConfig {Bean(jasyptStringEncryptor)public StringEncryptor stringEncryptor() {PooledPBEStringEncryptor encryptor new PooledPBEStringEncryptor();SimpleStringPBEConfig config new SimpleStringPBEConfig();config.setPassword(password);config.setAlgorithm(PBEWITHHMACSHA512ANDAES_256);config.setKeyObtentionIterations(1000);config.setPoolSize(1);config.setProviderName(SunJCE);config.setSaltGeneratorClassName(org.jasypt.salt.RandomSaltGenerator);config.setIvGeneratorClassName(org.jasypt.iv.RandomIvGenerator);config.setStringOutputType(base64);encryptor.setConfig(config);return encryptor;} }步骤三创建自定义注解 接下来我们创建两个自定义注解用于标记需要加解密的字段以及方法 举个例子 前端传递后端某些值需要加密入库 需要方法注解是加密后端返回前端某些值需要解密显示 需要方法注解是解密 定义一个作用在字段的注解 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface JasyptField { }定义一个作用在方法上的注解 Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface JasyptMethod {String value() default ENC; //ENC加密 DEC解密 }步骤四创建AOP切面 创建一个AOP切面主要思路是找到方法上标注了 JasyptMethod 注解且定义枚举类型是加密还是解密获取到对应参数 joinPoint.getArgs() 在进行加密或是获取返回对象解密无论加密解密最后调用 proceed(Object[] args) 方法改变值 需要注意处理的问题 1、获取参数如果是字符串直接加密字符串 2、获取参数是对象则通过反射获取对象字段上JasyptField注解的字段进行加密 3、获取参数是集合需要循环上一步骤操作 4、解密返回对象 同样需要处理字符串 、对象 、集合操作 注意看代码解释注意看代码解释注意看代码解释 import lombok.SneakyThrows; 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.aspectj.lang.reflect.MethodSignature; import org.jasypt.encryption.StringEncryptor; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component;import java.lang.reflect.Field; import java.util.List;Aspect Component Slf4j public class JasyptAspect {//注入加密类private final StringEncryptor stringEncryptor;// jasyptStringEncryptor 配置类中定义的名称public JasyptAspect(Qualifier(jasyptStringEncryptor) StringEncryptor stringEncryptor) {this.stringEncryptor stringEncryptor;}Pointcut(annotation(JasyptMethod))public void pointCut() {}SneakyThrowsAround(pointCut()))public Object jasyptAround(ProceedingJoinPoint joinPoint) {Object proceed;//获取注解类JasyptMethod jasyptMethod ((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(JasyptMethod.class);//获取注解传递值String value jasyptMethod.value();//获取参数Object[] args joinPoint.getArgs();// 这里可以定义常量或枚举判断博主就直接判断了if(value.equals(ENC)){for(int i0 ; i args.length ; i){// 判断字符串还是对象if(args[i] instanceof String) {args[i] stringEncryptor.encrypt(String.valueOf(args[i]));}else {//对象 还分集合还是单个对象boolean isList (args[i] instanceof List?);handlerArgs(args[i], value, isList);}}proceed joinPoint.proceed(args);}else{proceed joinPoint.proceed();// 判断字符串还是对象if(proceed instanceof String) {proceed stringEncryptor.decrypt(String.valueOf(proceed));}else {//对象 还分集合还是单个对象boolean isList (proceed instanceof List?);handlerArgs(proceed, value, isList);}}return proceed;}/*** 处理对象加解密* param obj 参数对象* param value 加解密值* param isList 是否集合*/private void handlerArgs(Object obj , String value , boolean isList){if(isList){ListObject objs (ListObject)obj;for(Object o : objs){handlerFields(o, value);}}else{handlerFields(obj, value);}}/*** 抽取公共处理字段加解密方法* param obj* param value*/private void handlerFields(Object obj , String value){Field[] fields obj.getClass().getDeclaredFields();for(Field field : fields){//判断是否存在注解boolean hasJasyptField field.isAnnotationPresent(JasyptField.class);if (hasJasyptField) {try {field.setAccessible(true);String plaintextValue null;plaintextValue (String)field.get(obj);String handlerValue;if(value.equals(ENC)){handlerValue stringEncryptor.encrypt(plaintextValue); //处理加密}else{handlerValue stringEncryptor.decrypt(plaintextValue); //处理解密}field.set(obj, handlerValue);} catch (IllegalAccessException e) {throw new RuntimeException(e);}}}} }步骤四创建示例实体类 模拟一个User类包含需要加密的字段并使用 JasyptField 注解标记 import lombok.Data;Data public class UserDto {JasyptFieldprivate String phone;JasyptFieldprivate String idCard;private int age; }步骤五创建测试Controller 创建一个 Controller 用于处理用户请求主要模拟保存单个对象、集合对象以及返回单个对象、集合对象的操作 import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList; import java.util.List;RestController RequestMapping(/api) Slf4j public class JasyptController {/*** 参数是字符串* param text* return*/RequestMapping(/param-text)JasyptMethodpublic String isStringParam(String text){log.info(参数是字符串: {} , text);return text;}/*** 参数是 单个对象* param userDto* return*/RequestMapping(/insert-user)JasyptMethodpublic UserDto insertUser(RequestBody UserDto userDto){log.info(参数是对象: {} , userDto.toString());//TODO 操纵入库return userDto;}/*** 参数是 集合对象* param userDtos* return*/RequestMapping(/insert-users)JasyptMethodpublic ListUserDto insertUsers(RequestBody ListUserDto userDtos){log.info(参数是集合: {}, userDtos.toString());//TODO 操纵入库return userDtos;}/*** 返回是对象* return*/RequestMapping(/get-user)JasyptMethod(DEC)public UserDto getUser(){//模拟数据库取出UserDto userDto new UserDto();userDto.setAge(10);userDto.setPhone(WyXyMRDDdvZEri1XcsPyMA/Pxvf/N9ODU612IXi4HazSK5NicKKzZJKolEz8bv);userDto.setIdCard(/KP3oTWB4pDRyyio54fJ634pIS7VyVxltNACLG/gtDof4UDYTICMdzsimbHGDJ0JwiubTLhHqMNxztyAU7zg);return userDto;}/*** 返回是集合对象* return*/RequestMapping(/get-users)JasyptMethod(DEC)public ListUserDto getUsers(){//模拟数据库取出UserDto userDto new UserDto();userDto.setAge(10);userDto.setPhone(WyXyMRDDdvZEri1XcsPyMA/Pxvf/N9ODU612IXi4HazSK5NicKKzZJKolEz8bv);userDto.setIdCard(/KP3oTWB4pDRyyio54fJ634pIS7VyVxltNACLG/gtDof4UDYTICMdzsimbHGDJ0JwiubTLhHqMNxztyAU7zg);UserDto userDto2 new UserDto();userDto2.setAge(100);userDto2.setPhone(WyXyMRDDdvZEri1XcsPyMA/Pxvf/N9ODU612IXi4HazSK5NicKKzZJKolEz8bv);userDto2.setIdCard(/KP3oTWB4pDRyyio54fJ634pIS7VyVxltNACLG/gtDof4UDYTICMdzsimbHGDJ0JwiubTLhHqMNxztyAU7zg);ListUserDto userDtos new ArrayList();userDtos.add(userDto);userDtos.add(userDto2);return userDtos;} }步骤六验证功能 运行 Spring Boot 应用程序并发送请求到接口。观察请求和响应中的数据确保密码字段已被加密 加密参数是字符串 加密参数是对象 加密参数是集合 解密返回是对象 解密返回是集合 至此我们所有测试均已通过小伙伴们可以复制博主的代码进行测试编写的代码结构如下仅为了演示所有类都放在一个包下 结语 通过本文的步骤我们成功地在Spring Boot项目中整合了Jasypt并使用自定义注解结合AOP实现了敏感字段的自动加解密。这种方法不仅提高了代码的可读性和可维护性还增强了数据的安全性。在实际项目中您可以进一步扩展和优化这个示例比如数据入库、数据查询等以适应更多复杂的需求。 希望本文对您有所帮助如果您有任何疑问或建议请随时留言讨论。如果觉得本文对你有所帮助希望 一键三连 给博主一点点鼓励
http://www.sczhlp.com/news/176170/

相关文章:

  • 秦皇岛网站建设哪里有个人网站 做外贸
  • 自己做视频网站犯法北京怎么样做网站
  • 网站开发服务器框架自己制作网址收款
  • 在线推广网站的方法有哪些网站代码seo优化
  • 免费试用网站 源码建筑公司名称大全简单大气
  • 晋城门户网站建设教学网站开发背景及意义
  • 网站备案流程及步骤wordpress的分类id
  • 网站类推广软文怎么写深圳做网站推荐哪家公司
  • tampermonkey油猴脚本, 动画疯评分显示增强脚本
  • dockercontainerd代理设置脚本
  • 一款专门为 WPF 打造的开源 Office 风格用户界面控件库
  • 网站建设的总结与改进公共服务标准化试点
  • 团购网站app制作网站 添加备案号
  • 网上做网站的WordPress和微信公众号自动回复
  • 网站发语音功能如何做高端网站建设 炫酷
  • 成都公众号小程序开发湘潭sem优化价格
  • asp.net 网站开发项目化教程阜宁网站建设找哪家好
  • 乐清市网站建设服务wordpress用户信息
  • 烟台优化网站高端设计公司
  • 有哪些免费的视频网站怎么做网站怎么引入广告挣钱
  • wordpress深度优化主题关键词推广优化排名品牌
  • 马蜂窝网站怎么做wordpress的意思
  • 摄影学校网站模板做电脑网站宽度
  • 网站开发与制作中期报告wordpress 国产评论插件
  • 网站项目遇到的问题建立网站怎么做
  • 简单的个人网站下载烟台网站建设方案优化
  • 京东网站建设缺点菜鸟网络属于哪个公司
  • 网站建设规划文档大庆市建设中专网站
  • 电子商务网站 整站 psdwordpress主页在
  • 购物网站的策划哈尔滨网站开发方案