首页 > 编程语言 >Java安全 - RMI源码分析

Java安全 - RMI源码分析

时间:2023-01-29 02:33:05浏览次数:55  
标签:Java 对象 创建 端口 源码 跟进 RMI 远程 LiveRef

RMI远程服务创建流程分析

1、远程对象创建过程

首先步入对象的构造方法

下一步

这里步入了父类UnicastRemoteObject的构造函数,传入一个参数port,作用是将远程对象随即发布到一个端口,此时默认值为0

这里对端口以及相关属性初始化,主要关注构造方法中的exportObject方法,将远程对象转换为Remote类型,与port端口传入方法中。两个被赋值null的参数与RMI获取客户端或服务端套接字有关。

进入exportObject方法

返回值的两个参数,第一个参数obj为创建的远程对象,第二个参数中新建了一个UnicastServerRef对象,并传入了端口port

继续跟进第二个参数

UnicastServerRef构造函数中调用父类构造器,创建一个LiveRef对象作为参数。var1=port

跟进LiveRef

ObjID应该与UID相关,目前不深究,继续跟进构造方法

到此已经可以看到与网络通信相关的类了,跟进TCPEndpoint,在跟进getLocalEndpoint方法之前,先来看看这个类的构造函数

发现了host和port属性被赋值了,就是在这个构造函数中,确定了远程对象的主机与端口

再来看getLocalEndpoint方法

后两个参数与RMI获取套接字有关,由于传入的值为null,不做分析

最终返回一个192.168.56.1:0的 地址:端口

回到LiveRef构造方法

可以知道通过第二个参数获取了远程对象需要的地址与端口,继续跟进LiveRef方法

this.ep被赋值为Endpoint,与远程对象的地址端口有关。

重点看一下ep

其中包括了hostport,以及一个非常重要的transport对象,transport才是真正处理网络请求的对象,TCPEndpoint是一层封装。

赋值完成后继续跟进,会回到UnicastServerRef调用父类构造器的地方。

父类构造器只是对ref属性赋值为创建的LiveRef对象

到这里,说明一下UnicastServerRefUnicastRef的关系

UnicastRef是UnicastServerRef的父类,UnicastServerRef继承UnicastRef使用于服务端,后者直接使用于客户端。

继续跟进回到exportObject方法

到目前为止,创建的LiveRef对象已经包含在sref中,并将sref赋值给远程对象obj的ref中。到此远程对象与需要的地址,端口等信息已经成功绑定。

继续跟进sref.exportObject

在这个方法中,为远程对象创建了一个代理,也就是客户端需要调用时使用的stub,在后续创建注册表后,将远程对象的stub放到注册中心,后续客户端从注册表获取stub进行远程调用。

跟进createProxy

当前的if判断,若进入会创建stub,条件主要根据stubClassExists值判断

可以看到stubClassExists中检测类名是否以_Stub结尾,这里主要在注册表相关操作中生效,如jar包中已经写好的类

不进入if语句中,之后进入动态代理的创建流程

获取类加载器,获取远程接口,获取调用处理器,使用三个参数创建代理

类加载器为AppClassLoader

远程接口中包含了远程对象接口RemoteObj等信息

处理器本质上还是LiveRef的封装

回到exportObject

这个判断创建的stub是否是RemoteStub的实例,这里判否,跳过

跟进Target构造方法

最重要的两个属性是dispstub,具体看看他们封装的内容

dispUnicastServerRef类型,而stub代理中的refUnicastRef类型,而stub是需要发布到注册表中,提供客户端获取使用的,其中都封装了同一个LiveRef,这也是RMI进行通信的核心,即使用LiveRef提供服务端和客户端使用。

其中还有一个比较重要的属性weakImpl

这里包含了接口的具体实现。

创建好Target后,执行ref.exportObject

跟进该方法

listen方法,这个是开启网络监听的方法。跟进listen

主要看newServerSocket方法,这个方法创建了用于监听的socket

继续跟进

端口是通过createServerSocket方法修改的,继续跟进

ServerSocket中,若将端口设为0,操作系统会为服务器自动分配一个端口,远程对象的端口在这个位置被修改了,listen根据hostport创建监听。

到此服务端远程对象的创建已经结束。接下来还需要在服务端对发布的对象进行记录。

调用ObjectTable.putTarget方法,其中有两个put方法。

var0为创建的Target对象,使用put方法将target的信息保存在系统的两个表中,到此服务端远程对象创建流程介绍完毕。

总结一下,在服务端创建远程对象过程中,核心为LiveRefLiveRef对象中包含了远程对象占用的地址和端口,以及对象UID。当一个远程对象被创建时,会生成一个服务器本地的RemoteObject对象,它持有一个UnicastServerRef对象,UnicastServerRef对象持有一个LiveRef对象;远程对象被创建时,还会生成一个UnicastRef对象,并封装到stub代理中,它持有与UnicastServerRef相同的LiveRefstub后续发布到注册表,以供客户端使用。

标签:Java,对象,创建,端口,源码,跟进,RMI,远程,LiveRef
From: https://www.cnblogs.com/p1a0m1a0/p/17071632.html

相关文章

  • JavaScript学习笔记—DOM简介
    DOM(DocumentObjectModel)文档对象模型使用JS去操作网页的一组对象DOM属于WebAPI的一部分。WebAPI中定义了非常多的对象,通过这些对象可以完成对网页的各种操作(添加删......
  • JavaSE学习笔记Day 1
     packagecom.baidu.demo;/***@authorbaozi*@version1.0*@since1.8*/publicclassDemo01{Stringname;/****@paramname*@return......
  • JavaScript学习笔记—垃圾回收
    垃圾回收(Garbagecollection)如果一个对象没有任何的变量对其进行引用,那么这个对象就是一个垃圾垃圾对象的存在,会严重的影响程序的性能在JS中有自动的垃圾回收机制,这些......
  • CentOS 7 安装和配置java环境
    yum安装1.检查系统环境首先你要熟悉你的系统环境,憨憨我一上来就是一通熟悉的操作。后来遇到了很多的问题,比如你的系统是32位还是64位。这与Windows不同它会直接告诉你,Lin......
  • 10 个问题搞定 Java 异常处理,值得收藏!
    本文总结了关于Java异常的十大常见问题。1.有检查的与无检查的简而言之,检查型异常必须在方法中明确捕获,或者在方法的throws子句中声明。未检查的异常是由无法解决的问题引......
  • JAVA的JDBC基础
    JDBC概念JDBC就是使用Java语言操作关系型数据库的一套API全称:(JavaDataBaseConnectivity)Java数据库连接 JDBC好处各数据库厂商使用相同的接口,Java代码......
  • 跟我学Java设计模式第7天:行为型设计模式
    Java设计模式文章目录​​跟我学Java设计模式第一天:设计模式概述和软件设计原则​​​​跟我学Java设计模式第二天:简单工厂模式、工厂方法模式、抽象工厂模式​​​​跟我学......
  • 互联网大厂(字节、华为)Java EE面试题:Servlet/JSP 部分解析+答案,最强八股文
    文章目录​​1.请列举至少6种javaEE技术,并简述其作用。​​​​解析:​​​​参考答案:​​​​2.在web.xml文件中配置Servlet时,主要配置哪些信息?​​​​解析:​​​​参考答......
  • Java零基础05篇:运算符的实际应用
    文章目录​​一、关系运算符(应用)​​​​二、逻辑运算符(应用)​​​​三、三元运算符(理解)​​​​三元运算符案例:​​​​1.需求​​​​2.需求:​​一、关系运算符(应用)关系......
  • Java枚举(Enum)类型原理探求
    Enum枚举类型Enum的全写是Enumeration,这个词的翻译是列举、逐条陈述、细目。在程序语言中,枚举类型是一种特殊的数据类型(常用的数据类型比如字符串、整型),这种数据类型的变量......