記錄一個好久之前的遇到的一個關於hessian的問題。
用 Hessian 實現 web service 過程當中,須要建立對象時,是使用 HTTP POST 方法來傳遞數據的。可是在有反向代理 (nginx) 的狀況下,會拋出異常 (com.caucho.hessian.client.HessianConnectionException: 411:java.io.IOException: Server returned HTTP response code: 411 for URL:http://xxxx/xxx/xxxService) 。
首先來看下 HTTP 411 錯誤的解釋: Length Required 服務器不能處理請求,除非客戶發送一個 Content-Length 頭。( HTTP 1.1 新)這是由於 Hessian 與服務端通訊默認是採起分塊的方式 (chunked encoding) 發送數據,而反向代理要得到 Content-Length 這個頭,才能處理請求,可是 Hessian 的請求中並無加入這個參數。
咱們使用的spring+hessian作服務化:
hessian本身的factory生成對象時:java
com.caucho.hessian.client.HessianProxyFactory中,默認ChunkedPost爲true private boolean _isChunkedPost = true; 分塊發送方式與服務端交換數據的參數,可是暫時nginx不支持
使用的spring的proxyfactorybean對象有一個setChunkedPost的方法,因此咱們能夠在配置bean的時候給chunkedPost設置爲false,從而透過nginx,實現通訊nginx
<bean id="xxx" class="org.springframework.remoting.caucho.HessianProxyFactoryBean"> <property name="serviceUrl" value=""/> <property name="serviceInterface" value=""/> <property name="chunkedPost" value="false"/> </bean>