java - 记录 Spring REST API

标签 java spring logging filter interceptor

我有自定义过滤器,我想记录请求的正文。 但是,当我使用 ContentCachingRequestWrapper 并尝试调用 getContentAsByteArray() 时,我总是得到一个空数组。

@Component
public class CustomFilter implements Filter {

    private final Logger log = LoggerFactory.getLogger(CustomFilter.class);

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest requestToCache = new ContentCachingRequestWrapper(request);

        chain.doFilter(req, res);

       log.info(getRequestData(requestToCache));
    }

    @Override
    public void init(FilterConfig filterConfig) {
    }

    @Override
    public void destroy() {
    }

    public static String getRequestData(final HttpServletRequest request) throws UnsupportedEncodingException {
        String payload = null;
        ContentCachingRequestWrapper wrapper = WebUtils.getNativeRequest(request, ContentCachingRequestWrapper.class);
        if (wrapper != null) {
            byte[] buf = wrapper.getContentAsByteArray();
            if (buf.length > 0) {
                payload = new String(buf, 0, buf.length, wrapper.getCharacterEncoding());
            }
        }
        return payload;
    }
  }

我也尝试创建Interceptor,但遇到了同样的问题。 我究竟做错了什么? 感谢您的帮助。

最佳答案

您只需在 @Configuration 注解的类中注册此 bean 即可使用现有的 spring 实现:

@Bean
public static Filter requestLoggingFilter() {
    final CommonsRequestLoggingFilter loggingFilter = new CommonsRequestLoggingFilter();
    loggingFilter.setIncludePayload(true);
    loggingFilter.setMaxPayloadLength(512);

    return loggingFilter;
}

关于java - 记录 Spring REST API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53241554/

相关文章:

java - 如何使用 Spring MVC 将参数(标识对象的主键)从 View 传递到 Controller ?

java - Spring Boot with Camel 无法加载应用程序上下文

java - Grails 应用程序使用来自 spring-mvc 后端的服务

java - Tomcat集群中使用ehcache进行缓存复制

python - 日志记录机制的差异 : API and application(python)

java - 登录android studio后如何加载新的activity?

java - 谷歌应用引擎 Java : Query on a child object

java - Spring应用程序启动时如何使缓存依赖于其他缓存

django - 通过主管和 docker-compose 从 django 输出彩色日志

postgresql - macOS 上的 PostgreSQL 日志在哪里?