1

私はハーバートシルトブックJava2コンプリートリファレンス第5版からJavaをステップバイステップで学習しています。スレッドを作成し、アプレットのRepaint()メソッドを呼び出すことにより、AppletViewerでバナーを表示してスクロールする単純なバナーアプレットを作成する途中です。しかし、実行可能なターゲットのスレッドオブジェクトをクレートしている間、このような例外がスローされます

java.security.AccessControlException: access denied (java.lang.RuntimePermission modifyThreadGroup)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:345)
at java.security.AccessController.checkPermission(AccessController.java:555)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at sun.applet.AppletSecurity.checkAccess(AppletSecurity.java:252)
at java.lang.ThreadGroup.checkAccess(ThreadGroup.java:304)
at java.lang.ThreadGroup.<init>(ThreadGroup.java:119)
at java.lang.ThreadGroup.<init>(ThreadGroup.java:95)
at Applet.SimpleBanner.start(SimpleBanner.java:49)
at sun.applet.AppletPanel.run(AppletPanel.java:475)
at java.lang.Thread.run(Thread.java:713)

他の記事を読んでセキュリティ許可が必要だと言っていますが、私のapplet.policyファイルにはすでにすべての許可が許可されています

grant { permission java.security.AllPermission;};

これは私の2番目のアプレットだけです。なぜそれがセキュリティ例外をスローするのか、そしてその解決策を簡単な言葉で詳しく説明できますか?

これが私のアプレットコードです。

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

/* A Simple Banner Applet.
 * This Banner Applet Creates a thread that scrolls the message contained
 * in msg right to left across banner's window.
 */

/*
 * <applet code="SimpleBanner" width=300 height=50>
 * </applet>
 */

public class SimpleBanner extends Applet implements Runnable{
private static final long serialVersionUID = 1L;
String msg = "Hello World";
Thread t = null;
ThreadGroup Grp;
int state;
boolean stopflag;

/**
 * Initialization method that will be called after the applet is loaded into
 * the browser.
 */
@Override
public void init() 
    {
    //Set Foreground and background color
    setBackground(Color.cyan);
    setForeground(Color.red);
    }

@Override
public void start()
    {
    //Start Thread
    Grp = new ThreadGroup("Group");
    t = new Thread(Grp, this);
    stopflag = false;
    t.start();
    }
//Entry Point for Thread that Runs The banner
@Override
public void run() 
{
char ch;
//Display Banner
for(;;)
    {
        try {
            repaint();
            Thread.sleep(250);
            ch=msg.charAt(0);
            msg =msg.substring(1,msg.length());
            msg +=ch;
            if (stopflag) 
            {
                break;
            }
        } catch (InterruptedException ex) {

        }
    }
}

@Override
public void stop()
{
// Pause The Banner
stopflag=true;
t=null;
}

@Override
public void paint(Graphics g)
{
//Display The Banner
    g.drawString(msg, 50, 30);
}
}
4

1 に答える 1

1

アプレットは、デフォルトでは、セキュリティ上の理由から、アクセス許可が制限されたサンドボックス環境で実行されます。アプレットにはスレッドグループを作成または変更するためのランタイム権限がないため、例外が発生します。新しいスレッドグループを作成しないでください。または、セキュリティポリシーを上書きして、スレッドグループを作成または変更するための実行時アクセス許可を付与することにより、アプレットがセキュリティポリシーを作成できるようにします。デフォルトの権限を上書きするには、ユーザーホームの.java.policyファイルで適切なポリシーを定義します。JREセキュリティディレクトリの下にあるグローバルポリシーファイルではなく、ユーザー固有のポリシーファイルを編集することをお勧めします。

JDKのポリシーツールを使用してポリシーを定義するか、手動で実行します。以下のテンプレートを参照してください。

grant codeBase "<code base>" {
  permission <type> "<target>", "<actions>";
  permission <type> "<target>", "<actions>";
  ...
};

For eg. 
grant codeBase "http://geosim.cs.vt.edu/geosim/-" {
  permission java.lang.RuntimePermission "modifyThreadGroup";
  ...
};
于 2012-09-01T13:24:00.163 に答える