4

setVisible(true) で、次のコードを呼び出してモーダル ダイアログを開始します。

private synchronized void startModal () {
  try {
    if (SwingUtilities.isEventDispatchThread()) {
      EventQueue theQueue = getToolkit().getSystemEventQueue();
      while (isVisible()) {
        AWTEvent event = theQueue.getNextEvent();
        Object source = event.getSource();
        if (event instanceof ActiveEvent) {
          ((ActiveEvent) event).dispatch();
        } else if (source instanceof Component) {
          ((Component) source).dispatchEvent(event);
        } else if (source instanceof MenuComponent) {
          ((MenuComponent) source).dispatchEvent(event);
        } else {
          System.err.println("Unable to dispatch: " + event);
        }
      }
    } else {
      while (isVisible()) {
        wait();
      }
    }
  } catch (InterruptedException ignored) { }
}

これは、ほとんどのブラウザーでうまく機能します。ただし、Windows 用の Opera と Safari では、次の大きな厄介な例外に直面しています。

java.security.AccessControlException: access denied (java.awt.AWTPermission accessEventQueue)
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkAwtEventQueueAccess(Unknown Source)
    at java.awt.Toolkit.getSystemEventQueue(Unknown Source)

これらのブラウザーで偽のモーダル ダイアログを生成するための回避策はありますか?

4

4 に答える 4

1

これが機能するためにアプレットに署名する必要はありませんか?

アプレットの署名

アプレットがこれらすべてのことを実行できるようにする方法は、アプレットにデジタル署名することです。事実上、署名者は、「このアプレットは安全に使用できます。私を信頼するなら、このアプレットを信頼できます。なぜなら、私の署名によって、私が署名してから改ざんされていないことを保証できるからです。」次に、ユーザーは署名者を信頼するかどうかを尋ねられ (通常は小さなダイアログ ボックスで)、信頼する場合、アプレットは完全な権限で続行できます。信頼が拒否された場合、アプレットは制限付きの権限でサンドボックス内で実行され続けます。

アプレットを信頼するかどうかの決定は、非常に慎重に行う必要があります。信頼できるアプレットには、ローカルで起動されたアプリケーションと同じ特権 (ファイルの読み取りと削除、およびネットワーク経由でのデータの送信) があるためです。

アプレットのセキュリティ モデルの詳細については、こちらを参照してください。これには、アプレットの制限の完全なリストが含まれています。

アプレット署名の概要と詳細情報へのリンクについては、これと特にこれをお読みください。Internet Explorer (および MS JVM) は少し非標準です。何をすべきかの概要については、これをお読みください。

アプレットに署名した後でも SecurityException が発生する場合は、コードを特権コードとして実行してみてください。

AccessController.doPrivileged(new PrivilegedAction() { public Object run() { // セキュリティに配慮した操作をここで実行 return null; } });

JavaDoc:java.security.AccessController

ポリシー ファイル

アプレットに追加機能を付与する別の方法は、ポリシー ファイルを使用することです。これについては、Sun が紹介記事を掲載しており、アプレット専用の別の記事がここにあります。ポリシーを使用すると、アプレットに付与する権限をよりきめ細かく制御できます。たとえば、アプレットにローカル ファイル システムへのアクセスを許可することが可能になりますが、アプレットが拒否するその他の機能は許可されません。これがその例です。

ポリシー ファイルを使用することの欠点は、ポリシー ファイルがローカル ファイル システムに存在することです。そのため、ユーザーは、通常は目に見えないファイルに変更を加える必要があり、その内容を理解するのは簡単ではありません。

次の例は、アプレットの制限のほとんどを取り消す方法を示しています。任意のパーミッションをより具体的にすることができます。たとえば、FilePermission は、選択したファイルに対してのみ、読み取り専用アクセスで与えることができます。各 Permission クラスの javadoc では、何が可能かを詳しく説明しています。可能な限り制限された設定を使用することをお勧めします。特に、RuntimePermission を使用して ClassLoaders と SecurityManagers を作成できます。これにより、さらに多くのアプレット制限を回避できます。

 grant codeBase "http://geosim.cs.vt.edu/geosim/-" {
   permission java.io.FilePermission "<<ALL FILES>>", "read, write, execute, delete";
   permission java.net.SocketPermission "*", "accept, connect, listen, resolve";
   permission java.util.PropertyPermission "*", "read, write";
   permission java.lang.RuntimePermission "*";
   permission java.awt.AWTPermission "showWindowWithoutWarningBanner";
 };

Javadoc

JavaDoc:java.awt.AWTPermission JavaDoc:java.io.FilePermission JavaDoc:java.lang.RuntimePermission JavaDoc:java.net.SocketPermission JavaDoc:java.util.PropertyPermission

于 2009-05-12T14:37:00.220 に答える
1

イベントスレッドでイベントをインターセプトする代わりに、機能する別のアプローチを提供できる場合は、ガラスペインを使用してすべての入力リクエストをブロックできます

于 2009-05-07T12:09:48.827 に答える