Javaアプレットのアクセス許可
-
03-07-2019 - |
質問
ユーザーがハードドライブからファイルを選択し、このファイルの最初の行を読み取り、追加の前処理のためにJavaScriptに渡す基本的なアプレットを作成し、ボタンをクリックすると、 HTTP POSTリクエストを介してそのファイルをアップロードします。この最後の部分でコピーして変更したファイルをアップロードするための非常に基本的なオープンソースアプレットを見つけました。
問題は、それでもまったく機能しないことです。正常に動作しているように見えますが、許可に関連する2つの障害に遭遇します。 Javaコンソールのメッセージは、アプレットに次の2つのアクセス許可に関するアクセス拒否エラーがあったことを示しています。
java.lang.RuntimePermission setFactory
java.io.FilePermission read
「奇妙なことに、これは、アプレットに「自己署名」を使用してビルドしたときにすでに許可を与えていたと思ったからです。オプションはNetBeansでチェックされ、クリックしてブラウザの小さなセキュリティポップアップを確認します。
また、ファイルを読み取り、最初の行をJavaScriptに渡す、自分でコーディングした部分も正常に機能します。これは、アプレットがローカルファイルシステムから読み取れることを示す非常に明確なインジケータです。実際にアップロードを開始しようとするまで、問題は始まりません。注意すべきことの1つは、アップロードプロセスは新しいスレッドで実行されるように思われるが、残りのすべてはスレッドを作成せずにメインクラスで実行されるということです。
私はJavaの初心者であり、Javaのスレッドについてほとんど知りません。どういうわけか、この新しいスレッドにアクセス許可を渡す必要がありますか?またはその効果のために何か? 事前に感謝します。
解決
おそらく、セキュリティ管理者(管理者ではなくコード)に特権操作を行う許可を求める必要があります。さまざまな理由から、アプレットがローカルファイルを開くことができるのは一般的に良いことではないため、かなり厳重に保護されています。
基本的なキーは、 AccessController.doPrivileged()
を呼び出すことです。 Java Ranch FAQでそれについての良い小さなチュートリアル。
他のヒント
私は同様の問題を抱えていましたが、解決に永遠にかかりました。 JavaScriptから呼び出されたアプレットメソッドには、ポリシーファイルで明示的に許可した場合でも、アクセス許可がありません。
この回避策はうまくいきました(アプレットがループするキューにコマンドを追加): http://blog.carrythezero.com/?p=5
ここで危険を理解してください:誰でもページ上のJavaScriptを変更し、アプレットに入力される内容を変更できます。私の場合、コードがWebサーバーで実行されることはなく、クラスは署名されていないため、ポリシーファイルで許可された特定の場所にない限り失敗します。
おそらくJavaScriptが署名されていないためです。特に何をしているのかわからない場合は、コードに署名しないことを強くお勧めします。 6u10から(Macにはまだない)アプレットはFileOpenServiceを含むJNLPを使用できるため、署名する必要はありません。