hessian 协议 版本 兼容

时间:2021-12-21 15:38:38

环境 :

       服务端:  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