Java RMIのHelloWorldプログラムおよび関連するセキュリティマネージャの知識


Java RMIとは、リモートメソッド呼び出し(Remote Method Invocation)のことです.これは、あるJava仮想マシン上のオブジェクトに別のJava仮想マシン内のオブジェクトを呼び出すメカニズムです.この方法で呼び出すことができる任意のオブジェクトは、リモートインタフェースを実装する必要があります.Java RMIは新しい技術ではありません(Java 1.1の時代にはありました)が、非常に重要な下位技術です.有名なEJBはすべてRMIの基礎の上で創立して、今いくつかのオープンソースの遠隔呼び出しコンポーネントがあって、その下層の技術もRMIです.Webサービス、SOAを大いに宣伝する時代には、どのアプリケーションも不器用なWebサービスコンポーネントを選んで実現すべきではないか.比較テストを通じてRMIが最も簡単で、いくつかの小さなアプリケーションの中で最も適切である.以下では、RMIの原理と応用を簡単な例で説明するが、以下の例は簡単なHelloWorldであるが、RMIのコア応用と開発モデルをカバーしている.
サーバー上のJAVA類は以下の通りです.
リモートインタフェース:HelloServicejava
import java.rmi.Remote;
import java.rmi.RemoteException;

/**
 *     
 * @author www.wjrong.com
 *
 */
public interface HelloService extends Remote {
	public String showMessage(String s) throws RemoteException;
}

リモートインタフェース実装クラス:HelloServiceImpl.java
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

/**
 *        
 * @author www.wjrong.com
 *
 */
public class HelloServiceImpl extends UnicastRemoteObject implements HelloService {
 private static final long serialVersionUID = 1L;
 public HelloServiceImpl() throws RemoteException
    {
     super();
    }
 public String showMessage(String s) throws RemoteException {
	 System.out.println("There is a customer call this method!");
	 
	 return "Hello "+s;
	}
}

リモートサーバ側起動クラス:SimpleServer.java
import java.rmi.Remote;
import java.rmi.RemoteException;


/**
 *     
 * @author www.wjrong.com
 *
 */
public interface HelloService extends Remote {
<span style="white-space:pre">	</span>public String showMessage(String s) throws RemoteException;
}

以下はクライアントが実行するJavaクラスです.
リモートインタフェース:HelloServicejava
import java.rmi.Remote;
import java.rmi.RemoteException;

/**
 *     
 * @author www.wjrong.com
 *
 */
public interface HelloService extends Remote {
	public String showMessage(String s) throws RemoteException;
}

クライアント起動クラス:SimpleClient.java
import java.rmi.RemoteException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

/**
 *       
 * @author www.wjrong.com
 *
 */
public class SimpleClient {
	public static final int rmiPort=8080;
	public static void main(String[] args) {
		try {
			Context context=new InitialContext();
			HelloService helloService1=(HelloService)context.lookup("rmi://192.168.1.180:"+rmiPort+"/HelloService");
			HelloService helloService2=(HelloService)context.lookup("rmi://localhost:"+rmiPort+"/HelloService");
			   try {
				    System.out.println(helloService1.showMessage("World!"));
				    //System.out.println(helloService1==helloService2);//       2          2        
				    //System.out.println(helloService1.equals(helloService2));//       2          2       ,           
				} catch (RemoteException e) {
					e.printStackTrace();
				}
			} catch (NamingException e) {
				e.printStackTrace();
			}
	}
}

テスト時にSimpleServerを起動し、SimpleClientサーバー側出力:There is a customer call this methodを起動します.クライアント出力:Hello World!簡単RMIテスト成功!  詳細に注意する点:1.セキュリティマネージャ
C:Program FilesJavajre 1.6.0_を上書きしていない場合05libsecurityのjava.policyの場合、呼び出す
if(System.getSecurityManager()==null)
System.setSecurityManager(new RMISecurityManager());
異常java.security.AccessControlExceptionが放出されます.理由:Javaアプリケーションごとに独自のセキュリティマネージャがあり、悪意のある攻撃を防ぐ主なセキュリティガードです.セキュリティマネージャは、実行フェーズのチェックとアクセス権限を実行することで、アプリケーションに必要なセキュリティポリシーを実装し、悪意のある操作からリソースを保護します.実際、セキュリティマネージャはJavaセキュリティポリシーファイルに基づいて、クラスに付与する権限のセットを決定します.しかし、信頼できないクラスおよびサードパーティアプリケーションがJVMを使用する場合、Javaセキュリティマネージャは、JVMに関連するセキュリティポリシーを使用して悪意のある操作を識別します.多くの場合、脅威モデルにはJVMで実行される悪意のあるコードが含まれていません.この場合、Javaセキュリティマネージャは必要ありません.セキュリティマネージャがセキュリティポリシーに違反する操作を検出すると、JVMによってAccessControlExceptionまたはSecurityExceptionが開始されます.  Javaアプリケーションでは、セキュリティマネージャはSystemクラスのメソッドsetSecurityManagerによって設定されます.現在のセキュリティマネージャを取得するには、メソッドgetSecurityManagerを使用します.JAva.lang.SecurityManagerクラスには、ファイルへのアクセス権を判断するためのcheckRead(String file)メソッドなど、多くのcheckXXXXメソッドが含まれています.これらのチェックメソッドは、セキュリティポリシーファイルに基づいて呼び出しアプリケーションが要求された操作を実行する権限があるかどうかを判断するSecurityManager.checkPermissionメソッドを呼び出します.ない場合は、SecurityExceptionが開始されます. アプリケーションにセキュリティマネージャとセキュリティポリシーを使用させる場合は、JVMの起動時に-Djava.security.managerオプションを設定し、セキュリティポリシーファイルを同時に指定することもできます.アプリケーションでJavaセキュリティマネージャが有効になっているのにセキュリティポリシーファイルが指定されていない場合、Javaセキュリティマネージャはディレクトリ$JAVA_にあるデフォルトのセキュリティポリシーを使用します.HOME/jre/lib/securityのjava.policy定義です.クラス・ローダはPolicyオブジェクトを使用して、仮想マシンにコードをインポートする際にどのような権限を与えるべきかを決定します.どのアプリケーションにもPolicyオブジェクトが1つしかありません.2.rmicに関する疑問rmicは、クライアントとサーバ側に関連するストレージ・ルートとスケルトン(実際にはエージェント・クラス)を生成することです.しかし、rmicの呼び出しがないように、javac javaのプロセスでリモートメソッドを直接呼び出すことができます.理由:jdk 5.0以前のバージョンでは、rmicコマンドを使用してリモート・オブジェクトに静的プロキシ・クラス(ルートとスケルトン・クラスを含む)を生成する必要がありましたが、jdk 5.0ではrmiフレームワークが実行中にリモート・オブジェクトに動的プロキシ・クラス(ルートとスケルトン・クラスを含む)を自動的に生成し、rmiフレームワークの実装の詳細をより徹底的にカプセル化します.rmiフレームワークの使用方法を簡略化した.3.registryローカルレジストリはなぜrmiregistry.exeを起動しないでローカルを完了するのか.登録つまみ?実際には、LocateRegistry.createRegistry(rmiPort)は、リモートレジストリまたはローカルレジストリへのローカル参照を作成し、Registryインスタンスを作成してエクスポートします.