【问题标题】:How to log REST request and response JSON objects如何记录 REST 请求和响应 JSON 对象
【发布时间】:2020-03-13 22:43:14
【问题描述】:

我想问你是否可以在没有 Spring 的情况下将日志系统添加到这个 CORS 示例(只是 Java“标准”和 Jersey 库)。

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet Filter implementation class CORSFilter
 */
// Enable it for Servlet 3.x implementations
/* @ WebFilter(asyncSupported = true, urlPatterns = { "/*" }) */
public class CORSFilter implements Filter {

    /**
     * Default constructor.
     */
    public CORSFilter() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) servletRequest;
        System.out.println("CORSFilter HTTP Request: " + request.getMethod());

        // Authorize (allow) all domains to consume the content
        ((HttpServletResponse) servletResponse).addHeader("Access-Control-Allow-Origin", "*");
        ((HttpServletResponse) servletResponse).addHeader("Access-Control-Allow-Methods","GET, OPTIONS, HEAD, PUT, POST");

        HttpServletResponse resp = (HttpServletResponse) servletResponse;

        // For HTTP OPTIONS verb/method reply with ACCEPTED status code -- per CORS handshake
        if (request.getMethod().equals("OPTIONS")) {
            resp.setStatus(HttpServletResponse.SC_ACCEPTED);
            return;
        }





**//String jsonRequestObject = ....;**

        // pass the request along the filter chain
        chain.doFilter(request, servletResponse);

**//String jsonResponseObject = ....;**
    }

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
    }

}

【问题讨论】:

  • 你想在所有请求和响应到达实际控制器之前记录它吗?
  • 我要在调用chain.doFilter方法之前填写收到的String jsonRequestObject,还要填写chain.doFilter方法执行后返回的String jsonResponseObject

标签: java json jersey


【解决方案1】:

如果你正在使用 jersey 实现,那么为什么要实现 Filter 接口,请使用推荐的 jersey 过滤器 'ContainerRequestFilter' 和 'ContainerResponseFilter'

https://javapapers.com/web-service/intercept-jax-rs-request-with-jerseycontainerrequestfilter/

【讨论】:

    【解决方案2】:

    尝试使用下面的代码

    public class LogHttpInterceptor implements ClientHttpRequestInterceptor {
    
        final static Logger log = LoggerFactory.getLogger(LogHttpInterceptor.class);
    
        @Override
        public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
            traceRequest(request, body);
            ClientHttpResponse response = execution.execute(request, body);
            traceResponse(response);
            return response;
        }
    
        private void traceRequest(HttpRequest request, byte[] body) throws IOException {
            log.trace("request begin===========================================================================");
            log.trace("URI         : {}", request.getURI());
            log.trace("Method      : {}", request.getMethod());
            log.trace("Headers     : {}", request.getHeaders() );
            log.trace("Request body: {}", new String(body, "UTF-8"));
            log.trace("request end=============================================================================");
        }
    
        private void traceResponse(ClientHttpResponse response) throws IOException {
            StringBuilder inputStringBuilder = new StringBuilder();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getBody(), "UTF-8"));
            String line = bufferedReader.readLine();
            while (line != null) {
                inputStringBuilder.append(line);
                inputStringBuilder.append('\n');
                line = bufferedReader.readLine();
            }
            log.trace("response begin==========================================================================");
            log.trace("Status code  : {}", response.getStatusCode());
            log.trace("Status text  : {}", response.getStatusText());
            log.trace("Headers      : {}", response.getHeaders());
            log.trace("Response body: {}", inputStringBuilder.toString());
            log.trace("response end===========================================================================");
        }
    

    【讨论】:

    • 要编译它,我需​​要 spring-web...jar。我需要 web.xm 中的其他内容或其他内容吗?谢谢!
    • 是的,请继续添加依赖项。您不需要对 web.xml 进行任何更改
    • 添加所有弹簧罐后,我在拦截方法中放置了一个断点,它没有被执行。能否请您发布您的 web.xml 或 application.xml?
    猜你喜欢
    • 2019-01-10
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 2023-03-15
    相关资源
    最近更新 更多