hessian原理服务端源码分析(三)

本文主要分析Hessian服务端的源码,从HessianServlet的service方法开始,探讨如何接收客户端请求,通过HessianInput和HessianOutput进行反序列化和序列化操作。重点讲解了HessianSkeleton类的invoke方法和readObject方法在处理请求及反序列化过程中的作用。
摘要由CSDN通过智能技术生成

上一篇文章分析了hessian客户端的源码,其实服务端的源码分析与客户端的差不多,只是服务端是先接收客户端的请求,将请求参数进行反序列化,再处理,将结果序列化转换成流返回给客户端,由于有了客户端源码分析,其他的就不多说了,直接上代码
1.为了能够跟进hessian服务端的源码,首先我们需要将导入hessian的jar包替换成源码,下面是我导入hessian源码的目录结构:
这里写图片描述
2.根据我们在hessian web中的web.xml配置的hessian servlet可知,接收客户端的请求是从HessianServlet中的service方法开始的,那么我们就在这个方法里面打个断点
调试的快捷方式:
F5进入方法 F6往下执行 F8到达下一个断点
下面是service方法中的代码

HttpServletRequest req = (HttpServletRequest) request;//转换成httpServletRequest
    HttpServletResponse res = (HttpServletResponse) response;

    if (! req.getMethod().equals("POST")) {
  //判断请求方法是不是post方法
      res.setStatus(500, "Hessian Requires POST");
      PrintWriter out = res.getWriter();

      res.setContentType("text/html");
      out.println("<h1>Hessian Requires POST</h1>");

      return;
    }

    String serviceId = req.getPathInfo();
    String objectId = req.getParameter("id");
    if (objectId == null)
      objectId = req.getParameter("ejbid");

    ServiceContext.begin(req, serviceId, objectId);

    try {
      InputStream is = request.getInputStream();
      OutputStream os = response.getOutputStream();

      response.setContentType("application/x-hessian");//设置请求类型

      if (_log.isLoggable(Level.FINEST)
      || _isDebug && _log.isLoggable(Level.FINE)) {
    PrintWriter dbg = new PrintWriter(new LogWriter(_log));
    HessianDebugInputStream dIs = new HessianDebugInputStream(is, dbg);
    dIs.startTop2();
    is = dIs;
    HessianDebugOutputStream dOs = new HessianDebugOutputStream(os, dbg);
    dOs.startTop2();
    os = dOs;
      }

      int code = is.read();
      int major;
      int minor;

      AbstractHessianInput in;
      AbstractHessianOutput out;

      if (code == 'H') {
    major = is.read();
    minor = is.read();

    if (major != 0x02 || minor != 0x00)
      throw new IOException("Version " + major + "." + minor + " is not understood");

    in = createHessian2Input(is);
    out = new Hessian2Output(os);

    in.readCall();
      }
      else if (code == 'c') {
    major = is.read();
    minor = is.read();

    in = new HessianInput(is);//获取hessian自己封装的输入流

    if (major >= 2)
      out = new Hessian2Output(os);
    
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值