当请求类型为www-form-urlencoded时,无法在Spring过滤器中访问请求有效负载

时间:2016-05-16 20:35:12

标签: spring spring-boot

一个非常简单的用例:

class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {
        String body = IOUtils.toString(req.getInputStream());
        // body is a always empty
    }
}

当我发送内容类型为application/json的请求时,我会获得实际的有效负载。但是当我以x-www-form-urlencoded发送它时,我不会得到任何数据。我假设其中一个弹簧过滤器已经消耗了数据,并且我的过滤器没有任何内容。

请注意,此问题与我们只能读取一次流的事实无关。我已经想到了这一部分,我正在为其他过滤器创建另一个带有缓冲输入流的HttpServletRequest。问题是Spring Boot中的其他内容正在读取我的所有数据,而这些数据一言不发。

我只想找到一种方法来掌握有效载荷。它不一定来自InputStream,如果春天可以给我一个byte[]的有效载荷,它将符合我的目的。

我正在使用Spring Boot 1.3.5。

2 个答案:

答案 0 :(得分:0)

我想这里的问题是 HiddenHttpMethodFilter ,它会消耗流。

请尝试通过添加以下代码来禁用过滤器,然后检查它是否有效

@Bean
public FilterRegistrationBean registration(HiddenHttpMethodFilter filter) {
    FilterRegistrationBean registration = new FilterRegistrationBean(filter);
    registration.setEnabled(false);
    return registration;
}

答案 1 :(得分:0)

您可以通过application.properties禁用此功能

spring.mvc.hiddenmethod.filter.enabled=false