如何记录 Spring @RestController @RequestMapping 方法的所有请求和标头信息?

Chr*_*ams 6 java rest spring request

我们有一个 Spring 方法来处理 REST 调用,但根据我们使用的客户端(浏览器与移动应用程序),我们遇到了一些问题。我们希望能够看到原始请求和标头,但无法弄清楚如何轻松做到这一点。我们想出的最好的方法是将 添加到HttpServletRequest方法中的参数中,并创建一个长方法来打印请求对象的各个部分。有没有更好的方法,比如为某些特定的 Spring 类打开调试日志记录org.springframework.web.*

我们的方法的编辑版本和printRequestInfo()方法是:

@RequestMapping(method = RequestMethod.POST, value = "/test/{testId}")
public void doSomething(@PathVariable Long testId,
        @RequestParam(value = "someOtherParam", required = false) String someOtherParam,
        HttpServletRequest req)
{
    printRequestInfo(req);
    // ...        
}

private void printRequestInfo(HttpServletRequest req) {
    StringBuffer requestURL = req.getRequestURL();
    String queryString = req.getQueryString();

    if (queryString == null) {
        logger.info("url: " + requestURL.toString());
    } else {
        logger.info("url: " + requestURL.append('?').append(queryString).toString());
    }

    logger.info( "method:" + req.getMethod());

    // print all the headers
    Enumeration headerNames = req.getHeaderNames();
    while(headerNames.hasMoreElements()) {
        String headerName = (String)headerNames.nextElement();
        logger.info("header: " + headerName + ":" + req.getHeader(headerName));
    }

    // print all the request params
    Enumeration params = req.getParameterNames();
    while(params.hasMoreElements()){
        String paramName = (String)params.nextElement();
        logger.info("Attribute: '"+paramName+"', Value: '"+req.getParameter(paramName) + "'");
    }
}
Run Code Online (Sandbox Code Playgroud)

Sot*_*lis 1

您提出的解决方案或多或少是您可以使用 Servlet API 实现的最佳解决方案(Spring MVC 是基于该 API 构建的,因此它不再提供任何其他功能)。

根据您使用的 Servlet 容器,它们可能已经有您可以使用的实现。例如,Tomcat 提供org.apache.catalina.filters.RequestDumperFilter请求和响应信息。