【发布时间】:2013-08-23 15:07:30
【问题描述】:
我正在开发使用 application/x-www-form-urlencoded 类型请求的 Web 服务。以下是此类请求正文的示例:
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。
【问题讨论】:
标签: java spring spring-mvc digital-signature