2016-05-16 28 views
0

一个非常简单的用例:无法访问请求负载在弹簧过滤器,当请求类型是WWW的形式,进行了urlencoded

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。

+0

什么是实现这种过滤器的原因? – RMachnik

+0

因此,我公开了在某些警报情况下触发的LogEntries webhook。 https://logentries.com/doc/webhookalert/。但是,他们设置了使用有效负载计算的授权令牌,我需要访问它才能在我身边进行计算并验证请求是否合法。 –

+0

你的使用案例类似于:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/filter/AbstractRequestLoggingFilter.html更精确的看你应该仔细看第277行https://github.com/spring-projects/spring-framework/blob/master/spring-web/src/main/java/org/springframework/web/filter/AbstractRequestLoggingFilter.java – RMachnik

回答

0

我猜这里的问题是HiddenHttpMethodFilter它消耗流。

请尝试通过添加以下代码,以禁用过滤器,然后检查是否正常工作

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