「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
以上です。長くなった・・・