我正在研究使用類型爲application/x-www-form-urlencoded
的請求的Web服務。這裏是這樣的請求體的示例:由客戶端Spring MVC中內容類型應用程序/ 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>
我相信春天以某種方式檢測到內容類型爲application/x-www-form-urlencoded
,並使用某種預處理。我的假設是否正確?這可以關閉嗎?
我使用Tomcat 7
+1。請注意,PayPal對他們的IPN通知犯了同樣的錯誤:有一個簽名步驟假定固定的參數順序。 OP並不孤單。 – EJP