快速业务通道

Hessian源码分析和Hack --让Hessian携带远程调用端的信息 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
ntext._count == 0) {     context._request = null;     context._headers.clear();    }   }   /**   * Returns the service request.   *   * @deprecated   */   public static ServletRequest getRequest()   {    ServiceContext context = (ServiceContext) _localContext.get();    if (context != null)     return context._request;    else     return null;   }   /**   * Returns the service id, corresponding to the pathInfo of the URL.   *   * @deprecated   */   public static String getServiceName()   {    ServiceContext context = (ServiceContext) _localContext.get();    if (context != null)     return context._serviceName;    else     return null;   }   /**   * Returns the object id, corresponding to the ?id= of the URL.   *   * @deprecated   */   public static String getObjectId()   {    ServiceContext context = (ServiceContext) _localContext.get();    if (context != null)     return context._objectId;    else     return null;   } }

Hessian源码分析和Hack --让Hessian携带远程调用端的信息(4)

时间:2011-06-25 iteye

原来ServiceContext 是用来保存当前调用线程的上下文的,比如request对象等(不知道这个解释对不对)。有了这个东西就太好了,因为里边有request,就有了调用端的一切信息,呵呵。

继续回来看那个Servlet,到了真正调用的时候了,也就是这段代码

Java代码

if (objectId != null)    _objectSkeleton.invoke(in, out);     else    _homeSkeleton.invoke(in, out);

跟踪invoke方法看看真面目

Java代码

public void invoke(AbstractHessianInput in, AbstractHessianOutput out)    throws Throwable   {    ServiceContext context = ServiceContext.getContext();    String header;    while ((header = in.readHeader()) != null) {     Object value = in.readObject();     context.addHeader(header, value);    }    String ip = context.getContextRequest().getRemoteAddr();    String methodName = in.readMethod();    Method method = getMethod(methodName);    if (method != null) {    }    else if ("_hessian_getAttribute".equals(methodName)) {     String attrName = in.readString();     in.completeCall();     String value = null;     if ("java.api.class".equals(attrName))    value = getAPIClassName();     else if ("java.home.class".equals(attrName))    value = getHomeClassName();     else if ("java.object.class".equals(attrName))    value = getObjectClassName();     out.startReply();     out.writeObject(value);     out.completeReply();     return;    }    else if (method == null) {     out.startReply();     out.writeFault("NoSuchMethodException",        "The service has no method named: " + in.getMethod(),        null);     out.completeReply();     return;    }    Class []args = method.getParameterTypes();    Object []values = new Object[args.length];    //args[0]    for (int i = 0; i < args.length; i++){      if(i == args.length-1){        values[

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号