打印HttpServletRequest JSON内容

isa*_*zan 1 java spring json spring-mvc

我正在开发一个Spring MVC应用程序.我写了一个mvc:拦截器来打印传入请求的JSON内容.我尝试了两种方法,但两种方法都不起作用.

使用getReader()的第一种方法不起作用,因为getReader()只能被调用一次,它似乎已被容器调用,因此建议使用ServletInputStream接口.我有以下代码:

public class RequestInterceptor implements HandlerInterceptor  {

private static final Logger logger = LoggerFactory.getLogger(RequestInterceptor.class);


@Override
public boolean preHandle(HttpServletRequest request,
        HttpServletResponse response, Object handler) throws Exception {

    logger.info("Received HTTP request with URL:" + request.getRequestURL());

    ServletInputStream in = request.getInputStream();
    byte[] buf = new byte[1000];
    StringBuilder sb = new StringBuilder();
    for (int nChunk = in.read(buf); nChunk!=-1; nChunk = in.read(buf))
    {
        sb.append(new String (buf,  0, nChunk));
    }

    logger.info("Request JSON Content" + sb.toString());


    return true;
}
...
}
Run Code Online (Sandbox Code Playgroud)

这种方法的问题是,在它通过拦截器并进入弹簧控制器后,它没有输入,可能是因为我的函数已经读取了输入.

我收到以下日志消息:

INFO : com.feelstream.server.interceptors.RequestInterceptor - Received HTTP request with URL:http://localhost:8090/server/FsServer/push_event
INFO : com.feelstream.server.interceptors.RequestInterceptor - Request JSON Content{
    "evt_time":7,
    "cell_id":7866,
    "cell_lac":31,
    "device_id":"62c7c7042511c086",
    ...
}



DEBUG: org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor - Reading [class com.feelstream.utils.Event] as "application/json" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@4bec03a6]
DEBUG: org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver - Resolving exception from handler [public com.feelstream.utils.Response com.feelstream.server.controller.FsController.pushEvent(com.feelstream.utils.Event,org.springframework.validation.BindingResult)]: org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: No content to map due to end-of-input
 at [Source: org.apache.catalina.connector.CoyoteInputStream@62818036; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
 at [Source: org.apache.catalina.connector.CoyoteInputStream@62818036; line: 1, column: 1]
Run Code Online (Sandbox Code Playgroud)

Mar*_*ler 6

以撒,

您应该能够像任何其他过滤器一样添加此过滤器

     <filter>
        <filter-name>commonsRequestLoggingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CommonsRequestLoggingFilter</filter-class>
     <init-param>
         <param-name>includePayload</param-name>
         <param-value>true</param-value>
      </init-param>
      </filter>
Run Code Online (Sandbox Code Playgroud)

在您的web.xml中

这将在Spring读取之前记录消息.如果需要其他日志记录,可以扩展此过滤器并添加更多功能.