2

ファイルをコンピューターにダウンロードし、関連するエディターで開くことができるアプレットを作成したいと考えています (ファイルが保存されると、再びアップロードされるはずです)。ただし、何時間もかけて動作させる前に、実際に管理可能であることを確認する必要があります (アプレットではなく Java デスクトップアプリケーションで実行しました)。

そこで、ファイルが存在しない場合にファイルを作成する簡単なアプレットを作成しました。アプリは署名され、必要に応じてブラウザーに読み込まれます。画面には次のように書かれています。

IO 例外: アクセスが拒否されました

さまざまなエラーにラベルを付けたので、どのエラーが失敗したかがわかります。以下は私のアプレットです:

import javax.swing.*;
import java.security.*;
import java.io.*;

public class DocumentApplet extends JApplet
{
    private static final long serialVersionUID = -2354727776089972258L;

    public void start ()
    {
        add ( new JButton ("Hello, World") );

        AccessControlContext acc = (AccessControlContext) System.getSecurityManager().getSecurityContext();
        try
        {
            acc.checkPermission(new FilePermission("test.txt", "write"));
        }
        catch (SecurityException e)
        {
            add (new JLabel ("Permission Exception: " + e.getMessage()));
            return;
        }

        try
        {
            File f = AccessController.<File>doPrivileged(new PrivilegedAction<File>()
            {
                public File run()
                {
                    return new File ("test.txt");
                }
            });

            if ( ! f.exists())
            {
                f.createNewFile();
            }
        }
        catch (AccessControlException e)
        {
            add (new JLabel ("Access: " + e.getMessage()));
        }
        catch (IOException e)
        {
            add ( new JLabel ("IO Exception: " + e.getMessage()));
        }
    }
}

これは、スローされる最後の例外です。私が最初に行うことは、権限を確認することです。そのチェックは失敗しません。

アプレットは自己署名されていますが、これは一時的なものです。アプレットが失敗した場合、証明書の購入に何百ドルも費やしたくありません..

appletviewerでアプリを実行すると、コードが機能します。それは問題ありませんが、実際の証明書を購入したときに機能することを知っておく必要があります。

HTML コード:

<applet code="DocumentApplet" archive="applet.jar" width="300" height="200">
</applet>

環境: Windows7 + JDK 1.7.0_05

PS: 過去 2 日間、Stackoverflow を読んだり、Google を検索したりしました。やるべきことはすべてやったと強く信じています...

4

1 に答える 1

0

これの理由はわかりませんが、ファイル名に次のプレフィックスを付けることで、ファイルに正常に書き込むことができました。

System.getProperty("java.io.tmpdir")

また

System.getProperty("user.home")

エラーメッセージに「アクセスが拒否されました」と表示されたので、セキュリティの問題だと思ったので、それはワイルドショットでした.

同じ問題を抱えている可能性のある他のすべての人に:

  • 指定された 2 つのディレクトリ以外のディレクトリにファイルを書き込まないでください。Windows Explorer を使用しているユーザーであっても、通常、Windows は C:\ へのファイルの書き込みを許可しないことに注意してください。
于 2012-07-02T19:41:43.257 に答える