java rmi 安全_Java安全初探-RMI篇

Java RMI初识

Java RMI 定义

Java RMI(Java Remote Method Invocation),即Java远程方法调用。是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。 Java RMI 使用 JRMP(Java Remote Message Protocol,Java远程消息交换协议)实现,使得客户端运行的程序可以调用远程服务器上的对象。是实现RPC的一种方式。

JRMP:Java Remote Message Protocol ,Java 远程消息交换协议。这是运行在Java RMI之下、TCP/IP之上的线路层协议。

注:Java RMI默认使用JRMP协议,而Weblogic RMI使用的是T3协议,此处应进行区分

RMI的交互

此处引用文章JAVA RMI 原理和使用浅析的一张图演示RMI的交互过程

df7dd6fb3205af0f0b44eee973083ae5.png

对于RMI流程的解释,网上有很多不错的回答,此处不过多阐述。通俗来讲,便是RMI Registry作为client和server的中间人,假设服务端是商品仓库,客户端是购买者,则RMI Registry就是中介,只负责告诉客户可以售卖的商品相关信息。仓库在中介处登记可售商品,客户从中介处查看可购买的商品。客户从中介处获得商品的相关信息,然后交给跑腿(存根stub)去跟仓库人员(骨架skeleton)取货,双方商品信息确认一致,进行交易,客户获得商品。(可能比喻有点不恰当,别揍我qwq...

RMI 尝试

此处为了更能体会rmi原理,不把server和client放在同一个机器,而是将服务器放在虚拟机中,测试环境均为1.8u211

编写远程服务接口,该接口必须继承 java.rmi.Remote 接口,方法必须抛出java.rmi.RemoteException 异常;

编写远程接口实现类,该实现类必须继承 java.rmi.server.UnicastRemoteObject 类;

运行 RMI 编译器(rmic),创建客户端 stub 类和服务端 skeleton 类;

启动一个 RMI 注册表,以便驻留这些服务;

在 RMI 注册表中注册服务;

客户端查找远程对象,并调用远程方法;

注意:这里踩了个小坑,RMI 抛出异常 no security manager: RMI class loader disabled,新手容易遇到这个问题。这是因为在编译class文件的时候,这个class文件内部已经包含了package test.org;这样的内容,如果在部署的时候,不严格按照这个目录部署的话,服务器就会找不到。所以服务器和客户端在路径上要保持一致。

Server测试例

org

└─test

├─RMI

│ RMIServer.java

└─Server

Hello.java

//RMIServer.java

package org.test.RMI;

import java.rmi.Naming;

import java.rmi.RemoteException;

import java.rmi.registry.LocateRegistry;

import java.rmi.server.UnicastRemoteObject;

import org.test.Server.Hello;

public class RMIServer {

public class RemoteHelloWorld extends UnicastRemoteObject implements Hello {

protected RemoteHelloWorld() throws RemoteException {

super();

}

public String hello() throws RemoteException {

System.out.println("call from");

return "Hello DEADF1SH_CAT~";

}

}

private void start() throws Exception {

RemoteHelloWorld h = new RemoteHelloWorld();

LocateRegistry.createRegistry(1099);

Naming.rebind("rmi://127.0.0.1:1099/Hello", h);

}

public static void main(String[] args) throws Exception {

new RMIServer().start();

}

}

//Hello.java

package org.test.Server;

import java.rmi.Remote;

import java.rmi.RemoteException;

public interface Hello extends Remote {

public String hello() throws RemoteException;

}

Client测试例

org

└─test

├─client

│ TrainMain.java

└─Server

Hello.java

//TrainMain.java

package org.test.client;

import java.rmi.Naming;

import org.test.Server.Hello;

public class TrainMain {

public static void main(String[] args) throws Exception {

Hello hello = (Hello) Naming.lookup("rmi://192.168.247.128:1099/Hel

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值