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

6
我们有一个处理REST调用的Spring方法,但是我们在使用不同客户端(浏览器 vs 移动应用)时会遇到一些问题。我们希望能够查看原始请求和标头,但是我们还没有找到如何轻松实现这一点的方法。目前最好的解决方案是将HttpServletRequest添加到我们方法的参数中,并创建一个长方法来打印请求对象的各个部分。是否有更好的方法,例如为某些特定的org.springframework.web.* Spring类启用调试日志记录?
下面是我们方法的编辑版本和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) + "'");
    }
}

注册 AbstractRequestLoggingFilter 的子类之一,并适当地配置它。另请参阅 https://dev59.com/M4Pba4cB1Zd3GeqPs4C6#25906059。 - M. Deinum
2个回答

3

我找不到其他方法来做这件事。

private Map<String, String> getRequestInformation(HttpServletRequest request) {
    Map<String, String> map = new HashMap<String, String>();
    Enumeration headerNames = request.getHeaderNames();
    while (headerNames.hasMoreElements()) {
        String key = (String) headerNames.nextElement();
        String value = request.getHeader(key);
        map.put("header: " + key, value);
    }
    Enumeration parameterNames = request.getParameterNames();
    while (parameterNames.hasMoreElements()) {
        String key = (String) parameterNames.nextElement();
        String value = request.getParameter(key);
        map.put("parameter: " + key, value);
    }
    Cookie[] cookies = request.getCookies();
    for (int i = 0; i < cookies.length; i++) {
        Cookie cookie = cookies[i];
        map.put("cookie: " + cookie.getName(), cookie.getValue());

    }
    while (parameterNames.hasMoreElements()) {
        String key = (String) parameterNames.nextElement();
        String value = request.getParameter(key);
        map.put("parameter: " + key, value);
    }
    map.put("getRequestIPAdrress", getRequestIPAdrress(request));
    map.put("getRemoteUser", request.getRemoteUser());
    map.put("getMethod", request.getMethod());
    map.put("getQueryString", request.getQueryString());
    map.put("getAuthType", request.getAuthType());
    map.put("getContextPath", request.getContextPath());
    map.put("getPathInfo", request.getPathInfo());
    map.put("getPathTranslated", request.getPathTranslated());
    map.put("getRequestedSessionId", request.getRequestedSessionId());
    map.put("getRequestURI", request.getRequestURI());
    map.put("getRequestURL", request.getRequestURL().toString());
    map.put("getMethod", request.getMethod());
    map.put("getServletPath", request.getServletPath());
    map.put("getContentType", request.getContentType());
    map.put("getLocalName", request.getLocalName());
    map.put("getProtocol", request.getProtocol());
    map.put("getRemoteAddr", request.getRemoteAddr());
    map.put("getServerName", request.getServerName());
    return map;
}

1
你提出的解决方案基本上是使用 Servlet API(Spring MVC 就是基于此构建的,因此它没有提供任何“更多”功能)能够做到的最好的。
根据你使用的 Servlet 容器不同,它们可能已经有了可用的实现。例如,Tomcat 提供 org.apache.catalina.filters.RequestDumperFilter 请求和响应信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接