springBoot之如何获取接口请求数据和返回数据实现日志
作者:LonesomeRoad 时间:2023-11-23 10:43:58
一、获取接口请求的数据
可以在Interceptor的afterCompletion中实现但是要重写RequestWrapper
代码记录如下:
HttpServletRequestFilter
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.io.IOException;
@Component
@WebFilter(filterName = "HttpServletRequestFilter", urlPatterns = "/")
@Order(10000)
public class HttpServletRequestFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
ServletRequest requestWrapper = null;
if(servletRequest instanceof HttpServletRequest) {
requestWrapper = new RequestWrapper((HttpServletRequest) servletRequest);
}
//获取请求中的流如何,将取出来的字符串,再次转换成流,然后把它放入到新request对象中
// 在chain.doFiler方法中传递新的request对象
if(null == requestWrapper) {
filterChain.doFilter(servletRequest, servletResponse);
} else {
filterChain.doFilter(requestWrapper, servletResponse);
}
}
@Override
public void destroy() {
}
}
RequestWrapper
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
public class RequestWrapper extends HttpServletRequestWrapper {
private final String body;
public RequestWrapper(HttpServletRequest request) {
super(request);
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
InputStream inputStream = null;
try {
inputStream = request.getInputStream();
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
char[] charBuffer = new char[128];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
} else {
stringBuilder.append("");
}
} catch (IOException ex) {
} finally {
if (inputStream != null) {
try {
inputStream.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
if (bufferedReader != null) {
try {
bufferedReader.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
body = stringBuilder.toString();
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
ServletInputStream servletInputStream = new ServletInputStream() {
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() throws IOException {
return byteArrayInputStream.read();
}
};
return servletInputStream;
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(this.getInputStream()));
}
public String getBody() {
return this.body;
}
}
afterCompletion
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception)
throws Exception {
logger.debug("SessionInterceptor");
// 获取地址
String url = request.getRequestURL().toString();
String requestMethod = request.getMethod();
String servletPath = request.getServletPath();
String body = new RequestWrapper(request).getBody();
String contentType = request.getContentType();
Map reqMap = new HashMap();
if(requestMethod.equals("POST")) {
if(!contentType.equals("text/plain"))
body = "body is file,don't show.";
if(body.length()>1000)
body = body.substring(0, 1000);
}
if(requestMethod.equals("GET")) {
// 获取请求参数
Map ParameterMap = request.getParameterMap();
Set<Map.Entry<String,String[]>> entry = ParameterMap.entrySet();
Iterator<Map.Entry<String,String[]>> it = entry.iterator();
while (it.hasNext()){
Map.Entry<String,String[]> me = it.next();
String key = me.getKey();
String value = me.getValue()[0];
reqMap.put(key,value);
}
}
logger.error("url: "+url+",requestMethod: "+requestMethod+",servletPath: "+servletPath+",body: " + body+",parameterMap: "+reqMap.toString());
}
二、获取接口返回的数据
可以在filter中实现但是要重写ResponseWrapper,
代码记录如下:
HttpServletResponseFilter
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.io.IOException;
@Component
@WebFilter(filterName = "HttpServletResponseFilter", urlPatterns = "/")
@Order(10000)
public class HttpServletResponseFilter implements Filter {
static Logger logger = Logger.getLogger(HttpServletResponseFilter.class.getName());
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
ResponseWrapper mResp = new ResponseWrapper(resp); // 包装响应对象 resp 并缓存响应数据
filterChain.doFilter(req, mResp);
byte[] bytes = mResp.getBytes(); // 获取缓存的响应数据
logger.error(new String(bytes,"utf-8"));
}
@Override
public void destroy() {
}
}
ResponseWrapper
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.*;
public class ResponseWrapper extends HttpServletResponseWrapper {
private ByteArrayOutputStream bytes = new ByteArrayOutputStream();
private HttpServletResponse response;
private PrintWriter pwrite;
public ResponseWrapper(HttpServletResponse response) {
super(response);
this.response = response;
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
return new MyServletOutputStream(bytes); // 将数据写到 byte 中
}
/**
* 重写父类的 getWriter() 方法,将响应数据缓存在 PrintWriter 中
*/
@Override
public PrintWriter getWriter() throws IOException {
try{
pwrite = new PrintWriter(new OutputStreamWriter(bytes, "utf-8"));
} catch(UnsupportedEncodingException e) {
e.printStackTrace();
}
return pwrite;
}
/**
* 获取缓存在 PrintWriter 中的响应数据
* @return
*/
public byte[] getBytes() {
if(null != pwrite) {
pwrite.close();
return bytes.toByteArray();
}
if(null != bytes) {
try {
bytes.flush();
} catch(IOException e) {
e.printStackTrace();
}
}
return bytes.toByteArray();
}
class MyServletOutputStream extends ServletOutputStream {
private ByteArrayOutputStream ostream ;
public MyServletOutputStream(ByteArrayOutputStream ostream) {
this.ostream = ostream;
}
@Override
public void write(int b) throws IOException {
ostream.write(b); // 将数据写到 stream中
}
@Override
public boolean isReady() {
// TODO Auto-generated method stub
return false;
}
@Override
public void setWriteListener(WriteListener listener) {
// TODO Auto-generated method stub
}
}
}
来源:https://blog.csdn.net/qq_24138151/article/details/106839127
标签:springBoot,接口,请求数据,日志
0
投稿
猜你喜欢
WPF实现带筛选功能的DataGrid
2022-05-07 07:48:56
Spring创建Bean的6种方式详解
2022-07-18 19:10:13
java多线程有序读取同一个文件
2022-05-28 20:41:57
android实现倒计时功能(开始、暂停、0秒结束)
2021-09-29 11:02:29
Unity3D实现简易五子棋源码
2021-08-15 15:57:04
Java 逻辑控制全面详解
2022-10-29 09:01:48
Android 操作excel功能实例代码
2021-07-02 23:48:23
C#设计模式之Builder生成器模式解决带老婆配置电脑问题实例
2021-07-09 03:22:59
Spring Security过滤器链体系的实例详解
2023-08-25 03:24:15
Mybatis中的like模糊查询功能
2023-09-25 11:57:28
Spring如何消除代码中的if-else/switch-case
2021-12-12 03:04:47
Java实现简单猜拳游戏
2023-05-27 18:28:16
Android实现GridView中ImageView动态变换的方法
2022-06-21 06:16:55
Android实现图片设置圆角形式
2023-07-29 16:37:32
c#方法重写和隐藏的学习示例
2022-12-24 14:20:12
C#创建安全的字典(Dictionary)存储结构
2023-03-17 22:11:51
Android高仿微信聊天界面代码分享
2023-01-23 12:03:03
Android 重写ViewGroup 分析onMeasure()和onLayout()方法
2023-10-27 23:58:06
java实现切割wav音频文件的方法详解【附外部jar包下载】
2021-07-08 22:29:56
Spring Boot 配置和使用多线程池的实现
2022-09-04 19:53:02