hessian 協議 版本 兼容


環境 :

       服務端:  hessian 4.0.38 , spring 4.3.6 ; spring文檔指出spring4.0以上的版本只能使用hessian 4.0以上的版本

       客戶端: hessian3.1.5

異常 :

服務端沒有異常 ,客戶端請求服務端拋出以下異常,無法獲取請求結果。

Caused by : com.caucho.hessian.io.HessianProtocolException: expected hessian reply at 0x48 (H)
    at com.caucho.hessian.io.Hessian2Input.error(Hessian2Input.java:2701)
    at com.caucho.hessian.io.Hessian2Input.startReply(Hessian2Input.java:405)
    at com.caucho.hessian.client.HessianProxy.invoke(HessianProxy.java:218)

分析 : 從異常可以看出服務端使用的是hessian2協議(Hessian2Input可以看出) ,客戶端使用hessian1協議無法解析結果。

處理 : 讓服務端和客戶端使用同一版本的jar包;不能換包可以使用一下方法,重寫org.springframework.remoting.caucho.HessianServiceExporter的doInvoke方法,實例如下:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.remoting.caucho.HessianServiceExporter;

import com.caucho.hessian.io.AbstractHessianInput;
import com.caucho.hessian.io.AbstractHessianOutput;
import com.caucho.hessian.io.Hessian2Input;
import com.caucho.hessian.io.Hessian2Output;
import com.caucho.hessian.io.HessianInput;
import com.caucho.hessian.io.HessianOutput;
import com.caucho.hessian.server.HessianSkeleton;

public class ExporterService extends HessianServiceExporter {

    // 是否使用hessian2協議
    private boolean enableHessian2;

    public boolean isEnableHessian2() {
        return enableHessian2;
    }

    public void setEnableHessian2(boolean enableHessian2) {
        this.enableHessian2 = enableHessian2;
    }

    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 可以進行權限攔截
        super.handleRequest(request, response);
    }

    @Override
    protected void doInvoke(HessianSkeleton skeleton, InputStream is, OutputStream os) throws Throwable {
        // 使用 hessian1協議
        AbstractHessianInput in = new HessianInput(is);
        AbstractHessianOutput out = new HessianOutput(os);

        // 使用hessian2協議
        if (isEnableHessian2()) {
            in = new Hessian2Input(is);
            out = new Hessian2Output(os);
        }
        skeleton.invoke(in, out);
    }

}

 參考 : http://blog.csdn.net/chjttony/article/details/6567511


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM