我正在开发使用类型请求的 Web 服务 application/x-www-form-urlencoded
。以下是此类请求正文的示例:
loginId=tester&action=add&requestId=987654321&data=somedata
请求SHA1withRSA
由客户端签名(使用 ),并且签名作为 HTTP 标头发送。
问题是我总是以不同的顺序获取参数,例如:
action=add&loginId=tester&requestId=987654321&data=somedata
因此验证签名总是失败。
有趣的是,只有当Content-Type
是application/x-www-form-urlencoded
并且如果我切换Content-Type
到text/plain
然后一切正常时才会发生这种情况。
我使用了不同类型的客户端(甚至使用 TCP 监视器监视流量),我确信问题不是由客户端应用程序引起的。
这是我的自定义消息转换器的一部分(请注意,我直接将传入的请求打印到控制台):
@Override
protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) throws IOException,
HttpMessageNotReadableException {
log.debug("> readInternal - message to Object");
InputStream inputStream = inputMessage.getBody();
byte[] bytes = IOUtils.toByteArray(inputStream);
String body = new String(bytes, charset);
log.debug("Body: {}", body);
}
还有我的 Spring MVC 配置:
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<array>
<bean class="converter.NvpHttpMessageConverter">
<property name="charset" value="UTF-8" />
<property name="nvpConverter" ref="nvpConverter" />
</bean>
</array>
</property>
</bean>
我相信 Spring 以某种方式检测到内容类型application/x-www-form-urlencoded
并使用某种预处理。我的假设正确吗?这个可以关掉吗?
我正在使用Tomcat 7。