Java 中怎么在 Spring MVC 中使用 ResponseBodyAdvice 对出参进行全局加密或统一包装

雨枫君_5383

雨枫君_5383

2026-08-17

773人浏览

原创

responsebodyadvice用于在spring mvc中统一处理响应体,支持响应包装和敏感字段加密;需实现接口并用@controlleradvice注解,通过supports()过滤、beforebodywrite()修改返回值。

java 中怎么在 spring mvc 中使用 responsebodyadvice 对出参进行全局加密或统一包装

在 Spring MVC 中,ResponseBodyAdvice 是一个接口,用于在控制器方法返回值被写入 HTTP 响应体之前,对其进行拦截和修改。它非常适合实现统一响应包装(如封装成 {"code":0,"msg":"ok","data":...})或对敏感字段进行全局加密(如对 data 中的手机号、身份证号等加密)。

实现 ResponseBodyAdvice 的基本步骤

你需要定义一个类,实现 ResponseBodyAdvice 接口,并用 @ControllerAdvice 注解使其生效。Spring 会自动扫描并应用该增强器。

  • 泛型参数 T 指定你要处理的返回类型(常用 Object 或具体 DTO 类)
  • supports() 方法决定是否对该控制器返回值生效(可按注解、类型、包路径等条件过滤)
  • beforeBodyWrite() 是核心逻辑入口,返回修改后的对象(比如包装后的结果或加密后的数据)

统一响应包装示例

假设你希望所有返回值都包装成 Result<t></t> 结构:

@ControllerAdvice
public class GlobalResponseAdvice implements ResponseBodyAdvice<object> {

    @Override
    public boolean supports(MethodParameter returnType, Class extends HttpMessageConverter>> converterType) {
        // 只对 @RestController 或明确标注 @ResponseBody 的方法生效
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType,
                                  MediaType selectedContentType,
                                  Class extends HttpMessageConverter>> selectedConverterType,
                                  ServerHttpRequest request,
                                  ServerHttpResponse response) {
        // 如果已经是 Result 类型,不重复包装
        if (body instanceof Result) {
            return body;
        }
        // 包装为成功响应
        return Result.success(body);
    }
}</object>

其中 Result.success(data) 返回类似 {"code":200,"msg":"success","data":{...}} 的结构。

对特定字段进行加密(如 data 中的敏感信息)

若需在包装前对 body 中某些字段加密(例如用户手机号),可在 beforeBodyWrite 中做深拷贝+脱敏处理:

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载
  • 不要直接修改原始对象(可能影响业务逻辑),建议使用反射或 Map/JSON 工具重构
  • 推荐用 Jackson 的 ObjectMapper 将 body 转为 JsonNode,遍历修改敏感字段,再转回对象或直接返回 JsonNode
  • 也可结合自定义注解(如 @Sensitive)标记需加密字段,在增强器中通过反射识别并替换

简单示例(仅加密字符串类型的手机号):

ObjectMapper mapper = new ObjectMapper();
if (body != null) {
    try {
        JsonNode node = mapper.valueToTree(body);
        if (node.isObject()) {
            JsonNode phoneNode = node.get("phone");
            if (phoneNode != null && phoneNode.isTextual()) {
                String encrypted = encrypt(phoneNode.asText()); // 自定义加密方法
                ((ObjectNode) node).put("phone", encrypted);
            }
        }
        return mapper.treeToValue(node, returnType.getParameterType());
    } catch (Exception e) {
        // 处理转换异常,可选择原样返回或抛出
    }
}

注意事项与避坑点

避免循环引用和类型不匹配:如果返回类型是 String(如直接返回 JSON 字符串),beforeBodyWrite 中不能返回 POJO,否则 Jackson 会报错。此时应判断 returnType.getParameterType() == String.class 并跳过处理或手动序列化。

慎用静态工具类加密:加密逻辑应尽量无状态、线程安全;若依赖密钥或上下文(如当前用户权限),需从 request 或 SecurityContext 中获取,而非硬编码。

与 @ExceptionHandler 配合使用:异常情况下控制器可能返回 ResponseEntity 或直接 throw 异常,ResponseBodyAdvice 不会处理这些场景,需配合全局异常处理器确保错误响应也符合统一格式。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

9137

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

6322

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

5652

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1004

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

848

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1196

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2409

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19751

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1095

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习