`

基于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代码来实现加密和解密过程。在加密阶段,我们读取配置文件的内容,使用选定的加密算法进行处理,并将结果保存到新的加密文件中。在解密阶段,我们需要先读取加密后的文件,解密后的内容再写...

    SpringBoot接口加密解密统一处理

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

    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等加密算法。 首先,我们需要创建自定义注解,用于标记哪些控制器方法需要执行加密和...

    Spring数据库连接等配置加密

    `propertyConfigurer`则告诉Spring使用解密器来处理配置文件中的加密属性。 最后,关于`junfeng`这个文件,它可能是作者在文章中提到的一种特定的加密方式或者一个工具的名称。由于没有具体的文件内容,这里无法给...

    基于注解实现SpringAop

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

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

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

    基于Spring Boot的通用API字段加密解密Starter插件设计源码

    该源码是一款基于Spring Boot的通用API字段加密解密Starter插件,包含49个文件,其中包括33个Java源文件、5个YAML配置文件、2个JPG图片文件、1个Git忽略文件、1个配置文件、1个LICENSE文件、1个Markdown文件、1个PNG...

    实现spring boot与普通jar加密

    综上所述,实现Spring Boot与普通JAR的加密涉及多个环节,包括选择合适的加密算法、编写加密工具、处理JAR文件、解密运行时以及考虑安全性、性能、备份策略和法规合规性。通过精心设计和实施,我们可以有效提升...

    spring中properties加密

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

    jasypt加密解密工具含源码有界面

    Jasypt(Java Simple and Strong Encryption)是一个强大的加密库,提供了简单易用的API,让开发者可以轻松地在应用程序中实现加密和解密功能。本篇文章将深入探讨Jasypt的核心概念、使用方法以及如何将其与Spring ...

    基于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)...

    SpringBoot控制器统一的响应体编码/加密与请求体解密的注解处理方式,支持MD5/SHA/AES/DES/RSA

    - 在SpringBoot中,我们可以创建自定义注解,例如`@EncryptResponseBody`和`@DecryptRequestBody`,来标记那些需要加密响应体或解密请求体的方法。 - 注解可以包含一些参数,比如加密/解密算法类型(MD5、SHA等)...

    前端加密登录,后端解密,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 接口 * ...

Global site tag (gtag.js) - Google Analytics