springBoot之怎么获取接口请求数据和返回数据实现日志

其他教程   发布日期:2024年12月17日   浏览次数:220

这篇文章主要介绍“springBoot之怎么获取接口请求数据和返回数据实现日志”,在日常操作中,相信很多人在springBoot之怎么获取接口请求数据和返回数据实现日志问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”springBoot之怎么获取接口请求数据和返回数据实现日志”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    一、获取接口请求的数据

    可以在Interceptor的afterCompletion中实现但是要重写RequestWrapper

    代码记录如下:

    HttpServletRequestFilter

    1. import javax.servlet.*;
    2. import javax.servlet.annotation.WebFilter;
    3. import javax.servlet.http.HttpServletRequest;
    4. import org.springframework.core.annotation.Order;
    5. import org.springframework.stereotype.Component;
    6. import java.io.IOException;
    7. @Component
    8. @WebFilter(filterName = "HttpServletRequestFilter", urlPatterns = "/")
    9. @Order(10000)
    10. public class HttpServletRequestFilter implements Filter {
    11. @Override
    12. public void init(FilterConfig filterConfig) throws ServletException {
    13. }
    14. @Override
    15. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    16. ServletRequest requestWrapper = null;
    17. if(servletRequest instanceof HttpServletRequest) {
    18. requestWrapper = new RequestWrapper((HttpServletRequest) servletRequest);
    19. }
    20. //获取请求中的流如何,将取出来的字符串,再次转换成流,然后把它放入到新request对象中
    21. // 在chain.doFiler方法中传递新的request对象
    22. if(null == requestWrapper) {
    23. filterChain.doFilter(servletRequest, servletResponse);
    24. } else {
    25. filterChain.doFilter(requestWrapper, servletResponse);
    26. }
    27. }
    28. @Override
    29. public void destroy() {
    30. }
    31. }

    RequestWrapper

    1. import javax.servlet.ReadListener;
    2. import javax.servlet.ServletInputStream;
    3. import javax.servlet.http.HttpServletRequest;
    4. import javax.servlet.http.HttpServletRequestWrapper;
    5. import java.io.*;
    6. public class RequestWrapper extends HttpServletRequestWrapper {
    7. private final String body;
    8. public RequestWrapper(HttpServletRequest request) {
    9. super(request);
    10. StringBuilder stringBuilder = new StringBuilder();
    11. BufferedReader bufferedReader = null;
    12. InputStream inputStream = null;
    13. try {
    14. inputStream = request.getInputStream();
    15. if (inputStream != null) {
    16. bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
    17. char[] charBuffer = new char[128];
    18. int bytesRead = -1;
    19. while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
    20. stringBuilder.append(charBuffer, 0, bytesRead);
    21. }
    22. } else {
    23. stringBuilder.append("");
    24. }
    25. } catch (IOException ex) {
    26. } finally {
    27. if (inputStream != null) {
    28. try {
    29. inputStream.close();
    30. }
    31. catch (IOException e) {
    32. e.printStackTrace();
    33. }
    34. }
    35. if (bufferedReader != null) {
    36. try {
    37. bufferedReader.close();
    38. }
    39. catch (IOException e) {
    40. e.printStackTrace();
    41. }
    42. }
    43. }
    44. body = stringBuilder.toString();
    45. }
    46. @Override
    47. public ServletInputStream getInputStream() throws IOException {
    48. final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
    49. ServletInputStream servletInputStream = new ServletInputStream() {
    50. @Override
    51. public boolean isFinished() {
    52. return false;
    53. }
    54. @Override
    55. public boolean isReady() {
    56. return false;
    57. }
    58. @Override
    59. public void setReadListener(ReadListener readListener) {
    60. }
    61. @Override
    62. public int read() throws IOException {
    63. return byteArrayInputStream.read();
    64. }
    65. };
    66. return servletInputStream;
    67. }
    68. @Override
    69. public BufferedReader getReader() throws IOException {
    70. return new BufferedReader(new InputStreamReader(this.getInputStream()));
    71. }
    72. public String getBody() {
    73. return this.body;
    74. }
    75. }

    afterCompletion

    1. @Override
    2. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception)
    3. throws Exception {
    4. logger.debug("SessionInterceptor");
    5. // 获取地址
    6. String url = request.getRequestURL().toString();
    7. String requestMethod = request.getMethod();
    8. String servletPath = request.getServletPath();
    9. String body = new RequestWrapper(request).getBody();
    10. String contentType = request.getContentType();
    11. Map reqMap = new HashMap();
    12. if(requestMethod.equals("POST")) {
    13. if(!contentType.equals("text/plain"))
    14. body = "body is file,don't show.";
    15. if(body.length()>1000)
    16. body = body.substring(0, 1000);
    17. }
    18. if(requestMethod.equals("GET")) {
    19. // 获取请求参数
    20. Map ParameterMap = request.getParameterMap();
    21. Set<Map.Entry<String,String[]>> entry = ParameterMap.entrySet();
    22. Iterator<Map.Entry<String,String[]>> it = entry.iterator();
    23. while (it.hasNext()){
    24. Map.Entry<String,String[]> me = it.next();
    25. String key = me.getKey();
    26. String value = me.getValue()[0];
    27. reqMap.put(key,value);
    28. }
    29. }
    30. logger.error("url: "+url+",requestMethod: "+requestMethod+",servletPath: "+servletPath+",body: " + body+",parameterMap: "+reqMap.toString());
    31. }

    二、获取接口返回的数据

    可以在filter中实现但是要重写ResponseWrapper,

    代码记录如下:

    HttpServletResponseFilter

    1. import javax.servlet.*;
    2. import javax.servlet.annotation.WebFilter;
    3. import javax.servlet.http.HttpServletRequest;
    4. import javax.servlet.http.HttpServletResponse;
    5. import org.apache.log4j.Logger;
    6. import org.springframework.core.annotation.Order;
    7. import org.springframework.stereotype.Component;
    8. import java.io.IOException;
    9. @Component
    10. @WebFilter(filterName = "HttpServletResponseFilter", urlPatterns = "/")
    11. @Order(10000)
    12. public class HttpServletResponseFilter implements Filter {
    13. static Logger logger = Logger.getLogger(HttpServletResponseFilter.class.getName());
    14. @Override
    15. public void init(FilterConfig filterConfig) throws ServletException {
    16. }
    17. @Override
    18. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    19. HttpServletRequest req = (HttpServletRequest) servletRequest;
    20. HttpServletResponse resp = (HttpServletResponse) servletResponse;
    21. ResponseWrapper mResp = new ResponseWrapper(resp); // 包装响应对象 resp 并缓存响应数据
    22. filterChain.doFilter(req, mResp);
    23. byte[] bytes = mResp.getBytes(); // 获取缓存的响应数据
    24. logger.error(new String(bytes,"utf-8"));
    25. }
    26. @Override
    27. public void destroy() {
    28. }
    29. }

    ResponseWrapper

    1. import javax.servlet.ServletOutputStream;
    2. import javax.servlet.WriteListener;
    3. import javax.servlet.http.HttpServletResponse;
    4. import javax.servlet.http.HttpServletResponseWrapper;
    5. import java.io.*;
    6. public class ResponseWrapper extends HttpServletResponseWrapper {
    7. private ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    8. private HttpServletResponse response;
    9. private PrintWriter pwrite;
    10. public ResponseWrapper(HttpServletResponse response) {
    11. super(response);
    12. this.response = response;
    13. }
    14. @Override
    15. public ServletOutputStream getOutputStream() throws IOException {
    16. return new MyServletOutputStream(bytes); // 将数据写到 byte 中
    17. }
    18. /**
    19. * 重写父类的 getWriter() 方法,将响应数据缓存在 PrintWriter 中
    20. */
    21. @Override
    22. public PrintWriter getWriter() throws IOException {
    23. try{
    24. pwrite = new PrintWriter(new OutputStreamWriter(bytes, "utf-8"));
    25. } catch(UnsupportedEncodingException e) {
    26. e.printStackTrace();
    27. }
    28. return pwrite;
    29. }
    30. /**
    31. * 获取缓存在 PrintWriter 中的响应数据
    32. * @return
    33. */
    34. public byte[] getBytes() {
    35. if(null != pwrite) {
    36. pwrite.close();
    37. return bytes.toByteArray();
    38. }
    39. if(null != bytes) {
    40. try {
    41. bytes.flush();
    42. } catch(IOException e) {
    43. e.printStackTrace();
    44. }
    45. }
    46. return bytes.toByteArray();
    47. }
    48. class MyServletOutputStream extends ServletOutputStream {
    49. private ByteArrayOutputStream ostream ;
    50. public MyServletOutputStream(ByteArrayOutputStream ostream) {
    51. this.ostream = ostream;
    52. }
    53. @Override
    54. public void write(int b) throws IOException {
    55. ostream.write(b); // 将数据写到 stream 中
    56. }
    57. @Override
    58. public boolean isReady() {
    59. // TODO Auto-generated method stub
    60. return false;
    61. }
    62. @Override
    63. public void setWriteListener(WriteListener listener) {
    64. // TODO Auto-generated method stub
    65. }
    66. }
    67. }

    以上就是springBoot之怎么获取接口请求数据和返回数据实现日志的详细内容,更多关于springBoot之怎么获取接口请求数据和返回数据实现日志的资料请关注九品源码其它相关文章!