项目中经常需要记录各种日志,尤其是web请求的请求信息和响应内容信息。请求信息我们可以通过拦截器很容易获取到,但是在拦截器中想要获取controller response body内容就不太容易了。
springmvc3 以后支持 实现 ResponseBodyAdvice 来获取web请求的response body
只要实现 ResponseBodyAdvice 接口类就行,如下:
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
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;
/**
* @author:
**/
@ControllerAdvice
public class MyResponseBodyAdvice implements ResponseBodyAdvice {
@Override
public boolean supports(MethodParameter methodParameter, Class aClass) {
//这个地方如果返回false ,不会执行 beforeBodyWrite 方法
return true;
}
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
System.out.println( "response body : " + o );
//返回body内容,可以在这里做修改,然后返回给前端
return o + " (这是在beforeBodyWrite拦截方法里添加的内容)";
}
}
测试类
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author:
**/
@RestController
public class TestController {
@RequestMapping("/test")
public String test(){
return "this is response content";
}
}
注意:
- spingmvc 版本要3以上
- 不要少了实现类上面的注解 @ControllerAdvice
- supports方法的需要返回true
- beforeBodyWrite需要返回body内容,如果返回null,前端是拿不到body内容的
测试结果
浏览器输入 http://127.0.0.1:8080/test
控制台输出如下:
2019-12-07 21:39:03.097 INFO 316628 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-12-07 21:39:03.097 INFO 316628 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2019-12-07 21:39:03.100 INFO 316628 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms
response body : this is response content
demo源码
链接:https://pan.baidu.com/s/198fE2vgippaQ4-CwuYS2Mw
提取码:j4ax