# SpringBoot3教程 - 15 拦截并修改返回结果

客户端请求服务器,有时候需要对返回结果进行统一的处理,例如修改响应头,对返回数据进行加密等。

我们可以在返回结果之前,将结果拦截,统一修改返回结果。


这里假设已经对返回结果进行了统一的处理,返回结果统一为 ResponseResult 类对象。

可以使用 @RestControllerAdvice 注解和 ResponseBodyAdvice 接口来完成对返回结果的拦截和处理。

创建一个类,名称自定义,实现 ResponseBodyAdvice 接口,并添加 @ControllerAdvice 注解。

package com.doubibiji.hellospringboot.interceptor;

import com.doubibiji.hellospringboot.dto.ResponseResult;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

@ControllerAdvice
public class ResponseResultAdvice  implements ResponseBodyAdvice<ResponseResult> {

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {

        // 这里表示只有返回结果类型为ResponseResult才进行拦截处理
        if (returnType.getParameterType().equals(ResponseResult.class)) {
            return true;
        }

        return false;  // 返回true表示拦截请求
    }

    @Override
    public ResponseResult beforeBodyWrite(ResponseResult body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {

        // 在这里就可以对返回的内容进行修改了
        body.setData("Hello Doubi!");

        return body;
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

在 beforeBodyWrite() 方法中,对返回的结果可以进行修改了。