我需要按原样将原始HTTP请求数据代理到另一个HTTP端点。
Spring MVC改变了HttpServletRequest
实例,并且在我有机会在我的控制器方法中检查它之前也消耗了request.getInputStream()
,它最终成为一个空流。
此外,Spring MVC将查询字符串参数与POST正文参数混淆,但仅在输入Content-Type
为application/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的默认过滤器的传入请求。我需要排除这些过滤器并重新开始。
答案 0 :(得分:0)
通过禁用HiddenHttpMethodFilter
,我能够解决MVC消耗POST主体的初始问题。
@Bean
public FilterRegistrationBean hiddenHttpMethodFilterRegistration(HiddenHttpMethodFilter filter) {
FilterRegistrationBean registration = new FilterRegistrationBean(filter);
registration.setFilter(filter);
registration.setEnabled(false);
return registration;
}