在日常开发中,有时候我们经常需要和第三方接口打交道,有时候是我们调用别人的第三方接口,有时候是别人在调用我们的第三方接口,那么为了调用接口的安全性,一般都会对传输的数据进行加密操作,如果每个接口都由我们自己去手动加密和解密,那么工作量太大而且代码冗余。那么有没有简单的方法,借助 spring 提供的 RequestBodyAdvice 和 ResponseBodyAdvice 可以实现解密和加密操作。
需求:
1,后台方法上如果有@Encrypt注解和@RequestBody修饰的方法,需要进行参数的解密
2,后台方法上如果有@Encrypt注解和@ResponseBody修饰的方法,需要进行参数的加密
3,加密和解密规则
加密:对返回的值中增加-encrypt值
解密:对传入的值中删除-encrypt值
注:
1,@Encrypt 为自定义的一个注解。
2,此处为了简单,就使用删除或增加-encrypt这个,实际情况下可以使用复杂的加解密规则
前置知识:
RequestBodyAdvice:在 sping 4.2 新加入的一个接口,它可以使用在 @RequestBody 或 HttpEntity 修改的参数之前进行参数的处理,比如进行参数的解密。
ResponseBodyAdvice:在 spring 4.1 新加入的一个接口,在消息体被HttpMessageConverter写入之前允许Controller 中 @ResponseBody修饰的方法或ResponseEntity调整响应中的内容,比如进行相应的加密。
功能实现:
1,编写加密注解类(Encrypt)
/** * 进行参数加密和解密 * * @author huan.fu * @date 2018/9/28 - 16:08 */ @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Encrypt { }
2,编写RequestBodyAdvice接口实现类,实现数据的解密操作
/** * 解密数据 * * @author huan.fu * @date 2018/9/28 - 16:09 */ @Slf4j @RestControllerAdvice public class ParamEncryptRequestBodyAdvice implements RequestBodyAdvice { @Override public boolean supports(MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) { return methodParameter.hasParameterAnnotation(RequestBody.class); } @Override public Object handleEmptyBody(Object o, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) { return o; } @Override public HttpInputMessage beforeBodyRead(HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) throws IOException { return new HttpInputMessage() { @Override public InputStream getBody() throws IOException { log.info("此处进行解密数据"); return new ByteArrayInputStream(IOUtils.toString(httpInputMessage.getBody()).replace("-encrypt", "").getBytes(StandardCharsets.UTF_8)); } @Override public HttpHeaders getHeaders() { return httpInputMessage.getHeaders(); } }; } @Override public Object afterBodyRead(Object o, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) { return o; } }
3,编写ResponseBodyAdvice接口实现类,实现数据的加密操作
/** * 加密数据 * * @author huan.fu * @date 2018/9/28 - 16:19 */ @Slf4j @RestControllerAdvice public class ParamEncryptResponseBodyAdvice implements ResponseBodyAdvice { private final ObjectMapper objectMapper = new ObjectMapper(); @Override public boolean supports(MethodParameter returnType, Class converterType) { return returnType.hasMethodAnnotation(ResponseBody.class); } @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { log.info("此处进行加密数据"); if (null != body) { try { Map map = objectMapper.readValue(objectMapper.writeValueAsString(body), Map.class); map.forEach((key, value) -> map.put(key, value + "-encrypt")); return map; } catch (IOException e) { log.error("加密数据失败.", e); } } return body; } }
4,编写控制层进行测试
/** * 用户信息控制器 * * @author huan.fu * @date 2018/9/28 - 15:55 */ @RestController @RequestMapping("user-info") @Slf4j public class UserInfoController { /** * 添加用户实现返回值加密 * * @param userInfo * @return */ @PostMapping("add") @Encrypt public UserInfo add(@RequestBody UserInfo userInfo) { log.info("添加新用户:[{}]", userInfo); return userInfo; } /** * 修改实现获取的参数进行解密 * * @param userInfo * @return */ @PostMapping("update") public UserInfo update(@Encrypt @RequestBody UserInfo userInfo) { log.info("修改用户信息:[{}]", userInfo); return userInfo; } }
5,测试参数的解密操作
可以看到:参数中的-encrypt 传递后后台被后台自动截取了,这样就类似于解密操作。
6,测试返回值的加密操作
可以看到:返回的值后面都有一个 -encrypt ,这样就实现了类似于加密操作。
相关推荐
在本文中,我们将详细介绍Spring MVC请求参数与响应结果全局加密和解密的相关知识点,包括请求参数的加密和解密、响应结果的加密和解密、ContentType的处理等。 首先,让我们了解一下请求参数的加密和解密。为了...
在使用@RequestBody接收前台参数之前可以先在RequestBodyAdvice的实现类中进行参数的解密,当操作结束需要返回数据时,可以在@ResponseBody之后进入ResponseBodyAdvice的实现类中进行参数的加密。 ...
接下来,我们需要编写Java代码来实现加密和解密过程。在加密阶段,我们读取配置文件的内容,使用选定的加密算法进行处理,并将结果保存到新的加密文件中。在解密阶段,我们需要先读取加密后的文件,解密后的内容再写...
5. **Spring MVC集成**:在Spring MVC中,可以使用拦截器(Interceptor)或AOP(面向切面编程)来统一处理加密和解密操作。拦截器可以在请求到达Controller之前进行预处理,而AOP则可以在方法执行前后进行拦截。 6....
本示例将围绕一个基于Spring框架实现的JSON接口,结合HTTPClient库进行网络通信,并利用DES(Data Encryption Standard)加密解密技术确保数据安全。 首先,我们来看JSON接口的实现。Spring框架提供了丰富的支持来...
在本主题中,我们将探讨如何利用自定义注解来实现SpringBoot中统一的响应体加密和请求体解密,支持MD5、SHA、AES、DES以及RSA等加密算法。 首先,我们需要创建自定义注解,用于标记哪些控制器方法需要执行加密和...
在本文中,我们将深入探讨如何在SpringBoot中实现接口的加密解密统一处理,以及如何通过自定义注解来灵活控制加密解密的执行。 首先,我们创建两个自定义注解,`DecryptRequest`和`EncryptResponse`,用于标识哪些...
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
Spring默认的`PropertyPlaceholderConfigurer`不直接支持加密的属性文件,但它提供了扩展点,允许我们自定义实现来处理加密后的属性。以下是一种实现方式: 1. 创建一个自定义的`PropertyPlaceholderConfigurer`...
本文将深入探讨如何在Spring项目中实现properties文件的加密。 1. **理解Properties文件** Spring框架广泛使用`properties`文件来存储配置信息。这些文件通常是纯文本格式,容易被读取,从而增加了安全性风险。...
综上所述,实现Spring Boot与普通JAR的加密涉及多个环节,包括选择合适的加密算法、编写加密工具、处理JAR文件、解密运行时以及考虑安全性、性能、备份策略和法规合规性。通过精心设计和实施,我们可以有效提升...
基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)...
对称加密是一种常见的加密算法类型,其特点是加密和解密使用的是同一密钥。这种加密方式速度快,效率高,适合大量数据的加密处理。在前端加密登录的场景中,前端应用通常会选用对称加密算法,如AES(Advanced ...
java aes128/256 对称加密解密,rsa对称加密解密验签实现,php java通用aes加密 支持任何形式的aes加密,文件,字符,字节等,内含php代码,可以与php平台实现aes加密,而且包含rsa非对称加密签名验签实现,都是对...
jvmti加密源码,包含基于jvmti,利用c++ 编译的动态库,用一定的算法将Java里.class加密的源码代码,以及在tomcat 上完成解密并正常启动的源码,支持spring框架 和springboot,防止反编译
通过配置 authentication-manager 元素和 password-encoder 元素,可以实现数据库认证和密码加密和解密功能。 相关知识点 * Spring Security 框架 * 数据库认证 * 用户密码加密和解密 * PasswordEncoder 接口 * ...
在Spring MVC应用中,我们可以创建一个Service或Util类来封装AES的加密和解密方法。这些方法可以接收明文数据和密钥作为输入,返回加密后的密文或者将密文解密回原始数据。例如: ```java public class AESUtil { ...
在Spring Security中,默认使用的是BCryptPasswordEncoder或者PBEWithMD5AndDES等加密算法。但为了满足特定需求,我们可以自定义密码编码器。下面是如何实现的步骤: 1. **创建自定义PasswordEncoder**:你需要创建...
我们将基于Spring Boot框架来构建一个实际示例,演示AES的加密与解密过程。 AES,全称为高级加密标准,是一种广泛使用的对称加密算法,因其高效性和安全性而备受青睐。在对称加密中,加密和解密使用的是同一把密钥...
在Spring MVC中,可以创建一个自定义的Bean,该Bean使用Java的`java.security.MessageDigest`类或其他加密库来实现加密功能。 2. **扩展Druid配置**:默认的Druid配置并不直接支持加密的用户名和密码。因此,我们...