zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    使用jquery插件操作哈希表Hashtable的应用
    学用 ASP.Net 之 "字符串" (1): 基础
    敬告
    jQuery 练习[一]: 准备工作
    学用 ASP.Net 之 "字符串" (2): string.Format
    jQuery 练习[二]: 获取对象(1) 基本选择与层级
    学用 ASP.Net 之 "字符串" (3): string 类的非扩展方法
    jQuery 练习[二]: 获取对象(2) 定位子对象
    一个分割文本文件的小程序 回复 "jellyang" 的问题
    Delphi 7 类库继承关系表
  • 原文地址:https://www.cnblogs.com/fzqm/p/6640814.html
Copyright © 2011-2022 走看看