hessian http response code:411

記錄一個好久之前的遇到的一個關於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>
相關文章
相關標籤/搜索