记录 Spring REST API

用户名

我有自定义过滤器,我想从请求中记录正文。但是当我使用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;
    }
  }

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

等级

您可以通过在带@Configuration注释的类中注册此 bean 来使用现有的 spring 实现

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

    return loggingFilter;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章