Spring MVC破坏了请求参数处理

时间:2015-11-17 19:24:43

标签: spring-mvc spring-boot

我需要按原样将原始HTTP请求数据代理到另一个HTTP端点。

Spring MVC改变了HttpServletRequest实例,并且在我有机会在我的控制器方法中检查它之前也消耗了request.getInputStream(),它最终成为一个空流。

此外,Spring MVC将查询字符串参数与POST正文参数混淆,但仅在输入Content-Typeapplication/x-www-form-urlencoded时才会混淆。为了正确代理行为,不得这样做。被代理的HTTP端点对维护单独的查询字符串与POST主体参数很敏感。

由于我不能依赖Spring MVC来破坏传入的请求状态,我需要完全绕过MVC并注册我自己的独立Servlet,我需要访问原始HTTP输入,而不是由Spring修改。

我的应用程序是一个Spring Boot(1.2.5)应用程序,它作为WAR部署到Tomcat 8,但是static void main用于在开发计算机上启动嵌入式Tomcat 8。

如何创建独立的Servlet来处理此代理逻辑?我已经尝试ServletRegistrationBean来注册servlet,但这仍然会破坏使用Spring的默认过滤器的传入请求。我需要排除这些过滤器并重新开始。

1 个答案:

答案 0 :(得分:0)

通过禁用HiddenHttpMethodFilter,我能够解决MVC消耗POST主体的初始问题。

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