1

JWS (Java Web Start) を使用してファイルにアクセスする際に問題が発生しています。プログラムは新しいラベルと画像を追加します。プログラムはローカル コンピューターでは問題なく動作しますが、JWS を使用してリモート サーバーでプログラムを実行すると、エラー ページが表示されます。エラーのサンプルを次に示します。

Exception in thread "AWT-EventQueue-0" java.security.AccessControlException: access denied (java.io.FilePermission add2.png read)
 at java.security.AccessControlContext.checkPermission(Unknown Source)
 at java.security.AccessController.checkPermission(Unknown Source)
 at java.lang.SecurityManager.checkPermission(Unknown Source)

これは、イメージに読み取りアクセス権があることを確認した後でも発生します。

アイデア?

4

4 に答える 4

4

アプレットと同様に、JNLP (webstart) はサーバー マシンではなくクライアント マシンで実行されます。クライアントは Web ページからプログラムをダウンロードし、ローカル マシンで実行します。スタッフ内のすべての参照はjava.io、ローカル ディスク ファイル システム (コードが実行される場所) を指し、リモート ディスク ファイル システム (コードがダウンロードされた場所) を指します。

次の 2 つのオプションがあります。

  1. 画像を JAR にパックし、ClassLoader#getResourceAsStream()代わりに使用して、そこから を取得InputStreamします。

    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    BufferedImage image = ImageIO.read(classLoader.getResourceAsStream("add2.png"));
    
  2. URLでアクセスできるように、画像をWebサーバーの公開場所に配置します(クラスパスにあるよりも少し遅いだけです)。

    BufferedImage image = ImageIO.read(new URL("http://example.com/add2.png"));
    

とはいえ、とにかく、java.io で絶対パスの代わりに相対パスを使用するのは悪い考えです。絶対にしないでください。これは、制御できない現在の作業ディレクトリに依存します。

于 2010-02-17T18:07:21.487 に答える
2

はどこadd2.pngですか?ファイルがローカル ファイル システム上にある場合 (ファイルがあるサーバーで.jnlpはなく)、ユーザーのプライバシーを保護するために、これは許可されません。また、別の Web サーバーからリソースを取得することも許可されていません。

JWS とアプレットのコードは、一般的に信頼されていないことに注意してください (デジタル署名されていて、ユーザーによって受け入れられている場合を除く)。そのため、それらに適用されるデフォルトの権限はかなり制限的でなければなりません。


追加するように編集:スタックトレースから、プログラムがリモートサーバーへのURLを使用するのではなく、ローカルファイルを読み取ろうとしているようです。java.io.Fileコードが;を参照していないことを確認してください。これは、問題のあるコードの領域を特定するのに役立ちます。

于 2010-02-17T00:27:57.397 に答える
0

JAR は署名されている必要があります。このチュートリアルを読んでください:

http://www.mobilefish.com/tutorials/java/java_quickguide_keytool.html

http://www-personal.umich.edu/~lsiden/tutorials/signed-applet/signed-applet.html

http://faq.javaranch.com/java/HowCanAnAppletReadFilesOnTheLocalFileSystem

于 2010-02-17T01:41:30.927 に答える
0

同様の問題に直面しました。

コントロール パネル -> Java からインターネット一時ファイルを削除することで解決しました。

于 2014-12-19T09:39:12.927 に答える