`

基于RequestBodyAdvice和ResponseBodyAdvice来实现spring中参数的加密和解密

阅读更多

    在日常开发中,有时候我们经常需要和第三方接口打交道,有时候是我们调用别人的第三方接口,有时候是别人在调用我们的第三方接口,那么为了调用接口的安全性,一般都会对传输的数据进行加密操作,如果每个接口都由我们自己去手动加密和解密,那么工作量太大而且代码冗余。那么有没有简单的方法,借助 spring 提供的  RequestBodyAdviceResponseBodyAdvice 可以实现解密和加密操作。

 

需求:

     1,后台方法上如果有@Encrypt注解和@RequestBody修饰的方法,需要进行参数的解密    

     2,后台方法上如果有@Encrypt注解和@ResponseBody修饰的方法,需要进行参数的加密

     3,加密和解密规则

           加密:对返回的值中增加-encrypt值

           解密:对传入的值中删除-encrypt值

     注:

          1,@Encrypt 为自定义的一个注解。

          2,此处为了简单,就使用删除或增加-encrypt这个,实际情况下可以使用复杂的加解密规则

 

前置知识:

RequestBodyAdvice:在 sping 4.2 新加入的一个接口,它可以使用在 @RequestBodyHttpEntity 修改的参数之前进行参数的处理,比如进行参数的解密

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 ,这样就实现了类似于加密操作。

 

 

 

 

 

  • 大小: 1.1 MB
  • 大小: 1.1 MB
分享到:
评论

相关推荐

    Spring MVC请求参数与响应结果全局加密和解密详解

    在本文中,我们将详细介绍Spring MVC请求参数与响应结果全局加密和解密的相关知识点,包括请求参数的加密和解密、响应结果的加密和解密、ContentType的处理等。 首先,让我们了解一下请求参数的加密和解密。为了...

    SpringBoot实现接口数据的加解密功能

    在使用@RequestBody接收前台参数之前可以先在RequestBodyAdvice的实现类中进行参数的解密,当操作结束需要返回数据时,可以在@ResponseBody之后进入ResponseBodyAdvice的实现类中进行参数的加密。 ...

    spring配置文件加密实现

    接下来,我们需要编写Java代码来实现加密和解密过程。在加密阶段,我们读取配置文件的内容,使用选定的加密算法进行处理,并将结果保存到新的加密文件中。在解密阶段,我们需要先读取加密后的文件,解密后的内容再写...

    jdk1.8实现http接口rsa加密解密.zip

    5. **Spring MVC集成**:在Spring MVC中,可以使用拦截器(Interceptor)或AOP(面向切面编程)来统一处理加密和解密操作。拦截器可以在请求到达Controller之前进行预处理,而AOP则可以在方法执行前后进行拦截。 6....

    json接口的spring实例(含httpclient、加密解密)

    本示例将围绕一个基于Spring框架实现的JSON接口,结合HTTPClient库进行网络通信,并利用DES(Data Encryption Standard)加密解密技术确保数据安全。 首先,我们来看JSON接口的实现。Spring框架提供了丰富的支持来...

    SpringBoot控制器统一的响应体加密与请求体解密的注解处理方式

    在本主题中,我们将探讨如何利用自定义注解来实现SpringBoot中统一的响应体加密和请求体解密,支持MD5、SHA、AES、DES以及RSA等加密算法。 首先,我们需要创建自定义注解,用于标记哪些控制器方法需要执行加密和...

    SpringBoot接口加密解密统一处理

    在本文中,我们将深入探讨如何在SpringBoot中实现接口的加密解密统一处理,以及如何通过自定义注解来灵活控制加密解密的执行。 首先,我们创建两个自定义注解,`DecryptRequest`和`EncryptResponse`,用于标识哪些...

    基于注解实现SpringAop

    基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop

    在Spring中使用加密外部属性文件

    Spring默认的`PropertyPlaceholderConfigurer`不直接支持加密的属性文件,但它提供了扩展点,允许我们自定义实现来处理加密后的属性。以下是一种实现方式: 1. 创建一个自定义的`PropertyPlaceholderConfigurer`...

    spring中properties加密

    本文将深入探讨如何在Spring项目中实现properties文件的加密。 1. **理解Properties文件** Spring框架广泛使用`properties`文件来存储配置信息。这些文件通常是纯文本格式,容易被读取,从而增加了安全性风险。...

    实现spring boot与普通jar加密

    综上所述,实现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)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)...

    前端加密登录,后端解密,aes加密

    对称加密是一种常见的加密算法类型,其特点是加密和解密使用的是同一密钥。这种加密方式速度快,效率高,适合大量数据的加密处理。在前端加密登录的场景中,前端应用通常会选用对称加密算法,如AES(Advanced ...

    java aes128/256 对称加密解密,rsa对称加密解密验签实现

    java aes128/256 对称加密解密,rsa对称加密解密验签实现,php java通用aes加密 支持任何形式的aes加密,文件,字符,字节等,内含php代码,可以与php平台实现aes加密,而且包含rsa非对称加密签名验签实现,都是对...

    基于jvmtiJava代码加密和解密源码

    jvmti加密源码,包含基于jvmti,利用c++ 编译的动态库,用一定的算法将Java里.class加密的源码代码,以及在tomcat 上完成解密并正常启动的源码,支持spring框架 和springboot,防止反编译

    Spring Security使用数据库认证及用户密码加密和解密功能

    通过配置 authentication-manager 元素和 password-encoder 元素,可以实现数据库认证和密码加密和解密功能。 相关知识点 * Spring Security 框架 * 数据库认证 * 用户密码加密和解密 * PasswordEncoder 接口 * ...

    AES加密解密

    在Spring MVC应用中,我们可以创建一个Service或Util类来封装AES的加密和解密方法。这些方法可以接收明文数据和密钥作为输入,返回加密后的密文或者将密文解密回原始数据。例如: ```java public class AESUtil { ...

    Spring security 自定义密码加密方式的使用范例。

    在Spring Security中,默认使用的是BCryptPasswordEncoder或者PBEWithMD5AndDES等加密算法。但为了满足特定需求,我们可以自定义密码编码器。下面是如何实现的步骤: 1. **创建自定义PasswordEncoder**:你需要创建...

    java前后端通讯AES加密及解密样例

    我们将基于Spring Boot框架来构建一个实际示例,演示AES的加密与解密过程。 AES,全称为高级加密标准,是一种广泛使用的对称加密算法,因其高效性和安全性而备受青睐。在对称加密中,加密和解密使用的是同一把密钥...

    druid实现springmvc数据库连接的用户名和密码加密

    在Spring MVC中,可以创建一个自定义的Bean,该Bean使用Java的`java.security.MessageDigest`类或其他加密库来实现加密功能。 2. **扩展Druid配置**:默认的Druid配置并不直接支持加密的用户名和密码。因此,我们...

Global site tag (gtag.js) - Google Analytics