首页 > 编程语言 >java安全-RMI

java安全-RMI

时间:2023-01-28 01:44:17浏览次数:45  
标签:Hello java 远程 安全 Registry 注册表 RMI public

Java安全 - RMI

1、RMI原理浅析

RMI(Remote Method Invocation) 远程方法调用,是允许运行在一个JVM中的对象调用另一个JVM中的对象方法。两台虚拟机可以是同一台宿主机的不同进程,也可以运行在网络不同主机中,RMI基本结构是基于行为定义行为实现分离原则设计的,即用于定义行为的接口和行为的实现代码分离,且允许在不同JVM中运行。

行为定义行为实现RMI中体现在行为定义的代码写在服务端中继承了Remote的接口里,且允许不同的两个类实现同一个远程服务接口;而具体的行为实现一个类在服务端实现具体行为,另一个类在客户端作为远程服务代理提供客户端调用远程方法。

RMI分为三个部分:ServerClientRegistry

其中介绍一下Registry的作用,Registry是一个注册表,其中存放了远程对象的(ip、端口、标识符),它可以与服务端放在一起,也可以独立放在另一台JVM中。Client在调用远程方法时,并不直接与Server通信远程调用方法不直接与服务端通信,会通过名称服务NamingRegistry中查找注册的远程对象,由Registry提供远程对象的引用,其中提供了主机名,端口以及标识符,客户端再通过这些引用信息与远程服务端通过socket连接。

为什么使用Registry,其中一个很重要的原因是方便提供多服务端的远程服务,一个Registry中可以提供不同服务器的远程对象引用。

图中提及bindrebind两个方法,其实他们是不同的类方法,Registry.bindNaming.rebind

  • bind使用注册表进行绑定,由于该方法直接使用了保留有注册表信息的类,不需要实现完整的RMI URL
  • rebind,使用java中的Naming名称服务进行绑定,在RMI中,名称服务不仅仅提供注册表的路径查询,所以需要指明完整的RMI URL

例如

//通过注册表绑定远程对象引用
registry.rebind("Hello", remoteObj);
//通过Naming绑定远程对象
Naming.bind("rmi://127.0.0.1:1099/remote", remoteObj);

服务端实现

编写远程对象的接口,声明远程对象的方法,接口需要继承Remote

public interface RemoteObj extends Remote {
    public String Hello() throws RemoteException;
}

实现远程对象接口,需要继承UnicastRemoteObject

public class RemoteObjImpl extends UnicastRemoteObject implements RemoteObj {
    protected RemoteObjImpl() throws RemoteException {
        System.out.println("RemoteObjImpl的构造方法");
    }
    @Override
    public String Hello() {
        return "Hello World";
    }
}

服务端启动以及创建注册表

public class RMIServer {
    public static void main(String[] args) throws RemoteException, MalformedURLException, AlreadyBoundException {
        //创建远程对象
        RemoteObj remoteObj = new RemoteObjImpl();
        //创建注册表,设置端口1099
        Registry registry = LocateRegistry.createRegistry(1099);
        //通过注册表绑定远程对象引用
        registry.rebind("Hello", remoteObj);
        //通过Naming绑定远程对象
//        Naming.bind("rmi://127.0.0.1:1099/remote", remoteObj);
    }
}

客户端实现

获取需要调用的远程对象的接口,这里直接将接口写入客户端中模拟

public interface RemoteObj extends Remote {
    public String Hello();
}

客户端调用远程方法

public class RMIClient {
    public static void main(String[] args) throws MalformedURLException, NotBoundException, RemoteException {
        Registry registry = LocateRegistry.getRegistry("localhost",1099);
//        RemoteObj remoteObj = (RemoteObj) Naming.lookup("rmi://127.0.0.1:1099/Hello");
        RemoteObj remoteObj = (RemoteObj) registry.lookup("Hello");
        String ret = remoteObj.Hello();
        System.out.println(ret);
    }
}

server

client

接下来会尝试浅析部分源码和通信流程

标签:Hello,java,远程,安全,Registry,注册表,RMI,public
From: https://www.cnblogs.com/p1a0m1a0/p/17069569.html

相关文章

  • 如何打造网络安全红队攻防实验室?设计篇
    红队攻防实验室之C2渗透区C2渗透区C2(Command&ControlServer)即命令控制服务器,用于者远程控制目标主机并向其发送指令,包括但不限于系统控制、文件操作、软件操作、......
  • JavaScript学习笔记—正则表达式
    用来定义一个规则通过这个规则计算机可以检查一个字符串是否符合规则或者将字符串中符合规则的内容提取出来也是JS中的一个对象,所以要使用正则表达式,需要先创建正则表达......
  • java学习记录
    makrdown学习标题二级标题字体粗体斜体斜体加粗划线引用引用分割号图片可以用复制的东西超链接点击列表............
  • JavaScript基础知识
    1.编程语言  1.1编程      1.2计算机语言    1.3编程语言    1.4翻译器      1.5编程语言和标记语言的区别   ......
  • Java的基本数据类型
    Java的基本数据类型介绍Java中变量的概念、基本数据类型、基本数据类型变量的使用及它们之间转换,最后还会对基本数据类型与String的转换做一个说明。Author:MsuenbDat......
  • gRPC介绍(以Java为例)
    1.简介1.1gRPC的起源RPC是RemoteProcedureCall的简称,中文叫远程过程调用。用于解决分布式系统中服务之间的调用问题。通俗地讲,就是开发者能够像调用本地方法一样调用......
  • 用 JavaScript 制作一个新年的日历小工具
    2023年,让我们携手一道兔谋大业、做出兔出贡献!同打拼、共丰盈、多喜乐、长安宁,好运一路相随兔气扬眉!......
  • Java与Modbus通信
    1、引入依赖<dependency><groupId>com.intelligt.modbus</groupId><artifactId>jlibmodbus</artifactId><!--版本号可依照mave......
  • javafx程序运行
    下载openjfxhttps://gluonhq.com/products/javafx/openjfx的LTS版本好像要付费才能下载,所以勾选“Includeolderversions”下载一个非LTS的。下载后解压到一个地方执......
  • 【参考答案】java基础练习:方法、递归
    方法实现定义方法(不用jdk提供的方法),计算x的y次方,如2的5次方packagecom.qzcsbj;/***@公众号:全栈测试笔记*@描述:<>*/publicclassTest{publicstaticvoid......