我正在将现有的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
我的问题是: