「Java」アプレットでローカルファイルにアクセスする

Java アプレットはセキュリティサンドボックス内で実行されるので、いろいろと制約がある。
もちろん、ローカルファイルへのアクセスなんかも普通にやるとできない。

今回、Java アプレットからローカルリソース ( ファイル ) にアクセスする方法を調べたので、
その時のメモ。
( 他にも Web にいっぱいわかりやす情報あります。このブログはあくまでメモなので、わかりやすい
情報は他のサイトあたってください・・・ )

やり方は、
1. 署名付きアプレットを使う
2. ポリシーファイルで AllPermission を与える
ぐらいかな。

ひとまず、ローカルのファイルにアクセスする Java アプレットを作成する。

import java.applet.Applet;
import java.awt.Graphics;
import java.io.*;

public class AppletTest1 extends Applet{
  public void paint(Graphics g){
    g.drawString("ファイル読み込みテスト",10,10); 
  	fileRead();
  }
	
	private void fileRead() {
		try{
            FileReader f = new FileReader("C:\\devspace\\temp\\Applet\\test.txt");
            BufferedReader b = new BufferedReader(f);
            String s;
            while((s = b.readLine())!=null){
                System.out.println(s);
            }
        }catch(Exception e){
        	e.printStackTrace();
        }
	}
}

コンパイルして、jar ファイルにしておく。

javac AppletTest.java
jar cvf AppletTest.jar AppletTest.class

上記の Java アプレットを呼び出す HTML ファイル ( AppletTest.html ) を作成する。

<html>
<head><title>Applet Test</title></head>
<body>
<applet code="AppletTest.class" archive="AppletTest.jar"></applet>
</body>
</html>

test.txt の内容は以下。

hoge
uga
oro

上記を作成し、AppletTest.jar と AppletTest.html を Web サーバの適当な箇所に配置して、
ブラウザからアクセスすると、test.txt にアクセスできない旨の例外が発生することが確認できる。
( Java コンソールから確認 )

java.security.AccessControlException: access denied ("java.io.FilePermission" "C:\devspace\temp\Applet\test.txt" "read")


ここから本番。

1. 署名付きアプレットを使用する

以下で jar ファイルに署名を行なう。

keytool -genkey -alias hoge -keypass password
jarsigner -keypass password AppletTest.jar hoge

この状態で、さっきと同様にブラウザから Java アプレットにアクセスする。
Java コンソールに以下のような出力があれば成功。わりとあっさり!

hoge
uga
oro


2. ポリシーファイルで AllPermission を与える

ひとまず、1 で作成した署名付き jar ファイルは削除して、新たに署名のない jar ( AppletTest.jar )
を作成しておく。

ポリシーファイルは、以下の設定を行なう。

grant codeBase "http://localhost/Applet/tmp/*" {
	permission java.security.AllPermission;
};

上記を C:\Users\{ユーザ名} ( echo %USERPROFILE% で表示される ) に ".java.policy" として保存する。

で、ブラウザから Java アプレットにアクセスすると、無事、ローカルファイルにアクセスできた。
".java.policy" って、先頭のピリオド注意ですかね ( ここちょっとはまった・・・ )


ちゃんと読んでないですが、ドキュメントはこの辺りですかね。
アプレット開発者ガイド
http://docs.oracle.com/javase/jp/7/technotes/guides/jweb/applet/applet_dev_guide.html
Java SE 7 Development Kit (JDK) でのアクセス権
http://docs.oracle.com/javase/jp/7/technotes/guides/security/permissions.html
・デフォルトの Policy の実装とポリシーファイルの構文
http://docs.oracle.com/javase/jp/7/technotes/guides/security/PolicyFiles.html

以上です。長くなった・・・