ServletFilter中的覆盖请求标头的内容类型与直接发送内容类型不同

时间:2019-06-27 22:12:00

标签: java spring spring-boot servlet-filters request-headers

我正在将现有的PHP应用程序转换为Spring Boot 2.1.x。

客户端发送的一个请求(因此必须向后兼容),是一个带有POST的{​​{1}}请求,一些请求参数和Base64编码的有效负载。 curl请求看起来像这样: Content-Type: application/x-www-form-urlencoded

我们的PHP应用程序并不十分严格,可以愉快地接受此请求,我可以轻松解码给定的base64有效负载。

但是,对于Spring Boot,问题在于它可以清理输入,因为它被视为来自表单的输入。这是在

  • curl -H "Content-Type: application/x-www-form-urlencoded" -d "abc+123/XYZ=" http://localhost:8080/testing\?x\=\&Z\=U
  • -> org.springframework.http.server.ServletServerHttpRequest#getBody
  • -> org.springframework.http.server.ServletServerHttpRequest#isFormPost

现在,如果我使用org.springframework.http.server.ServletServerHttpRequest#getBodyFromServletRequestParameters发送请求,则它在Spring中可以正常工作: Content-Type: text/plain

所以我的想法是简单地创建一个curl -H "Content-Type: text/plain" -d "abc+123/XYZ=" http://localhost:8080/testing\?x\=\&Z\=U,包装请求并以Filter的形式返回text/plain

Content-Type

这是链中的第一个过滤器,它针对内容类型起作用,该内容类型现在始终被视为@Component @Order(Ordered.HIGHEST_PRECEDENCE) class MyFilter : Filter { override fun doFilter(request: ServletRequest?, response: ServletResponse?, chain: FilterChain?) { if (request is HttpServletRequest && "application/x-www-form-urlencoded" == request.contentType && HttpMethod.POST.matches(request.method)) { chain?.doFilter(PlainHeadersRequest(request), response) } else { chain?.doFilter(request, response) } } } class PlainHeadersRequest(request: HttpServletRequest?) : HttpServletRequestWrapper(request) { override fun getContentType(): String { return "text/plain" } }

我的期望是,使用此过滤器,上面的两个curl命令都可以互换工作。

但事实并非如此。使用过滤器,我收到:

text/plain

我的问题是:

  • 第一个过滤器的之前,内容类型在哪里有区别?
  • (如何在Spring Boot应用程序前面不使用任何其他软件(例如nginx代理)来解决此问题?->已解决,请参见注释)

0 个答案:

没有答案