# 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
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() 方法中,对返回的结果可以进行修改了。