Rumah >Java >javaTutorial >Bagaimana untuk mendapatkan data permintaan antara muka dan log pelaksanaan data pulangan dalam springBoot

Bagaimana untuk mendapatkan data permintaan antara muka dan log pelaksanaan data pulangan dalam springBoot

WBOY
WBOYke hadapan
2023-05-13 08:25:121623semak imbas

    1 Dapatkan data yang diminta oleh antara muka

    boleh dilaksanakan selepas Pemintas Penyiapan tetapi kod RequestWrapper

    perlu ditulis semula seperti berikut:

    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());
            
            
        }

    2.>

    Dapatkan data yang dikembalikan oleh antara muka

    boleh dilaksanakan dalam penapis tetapi ia perlu Tulis Semula ResponseWrapper,

    kod direkodkan seperti berikut:

    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

    rreee

    Atas ialah kandungan terperinci Bagaimana untuk mendapatkan data permintaan antara muka dan log pelaksanaan data pulangan dalam springBoot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam