2

キオスクタイプの環境に展開された Firefox 18.0.1 を使用して、署名付きアプレットを実行しています。JDK と JRE はどちらも JavaSE 7u11 です。署名された jar を使用すると、サンドボックス化されたアプレットでは通常ユーザーに対して実行できないすべてのことを実行できます (ローカル ディスクをさまよう、プリンターと通信する、すべての pr0n を盗むなど)。

アプレットとそれをロードするページが共謀して HTML と JavaScript を生成します。JavaScript とアプレットは、ほぼシームレスな方法でやり取りします。アプレットがポップアップ ダイアログを作成することがあります。これらは、ユーザーが Java コンポーネントをクリックすることによってトリガーされるか、アプレットにダイアログを作成するように指示する「onclick」スクリプトを含む HTML ウィジェットをクリックすることによってトリガーされます。

先週、アプレットのポップアップ ダイアログのいくつかに問題があることに気付きました。ダイアログ ボックスのに小さな警告アイコンがぶら下がっています。

小さな小さな強打

ユーザーがアイコンを移動すると、アイコンはダイアログに接着されます。アイコンにカーソルを合わせると、小さな「Java アプレット ウィンドウ」ツールチップが表示されます。これは、すべてのダイアログが一緒に表示されるわけではないため、特に興味深いものです。

そのスナップショットに示されているウィンドウは、このテスト コードで作成されました。(はい、JOptionPane を使用するより短い方法がありますが、実際のコードを複製することはできません。一部のダイアログは他のダイアログよりもカスタマイズされています。)

import java.awt.BorderLayout;

import javax.swing.JApplet;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class WhereTheHellDoesTheIconComeFrom
{
    private JPanel topPanel;

    public WhereTheHellDoesTheIconComeFrom (JApplet applet) {
        // Multiple panels with a text blob in each
        JLabel exampleText = new JLabel ("some text here", JLabel.CENTER);
        topPanel = new JPanel (new BorderLayout(5,0));
        topPanel.add (exampleText, BorderLayout.CENTER);

        // Create the options pane.
        Object allpanels[] = new Object[] {
            topPanel,
        };
        Object buttons[] = { "B1", "B2" };

        JOptionPane optionPane = new JOptionPane (allpanels,
            JOptionPane.PLAIN_MESSAGE,
            JOptionPane.OK_CANCEL_OPTION,
            null,   // no icon built in
            buttons,
            buttons[0]);  // select this button by default

        // Ask it for the visible popup.
        JDialog dialog = optionPane.createDialog(
            SwingUtilities.getWindowAncestor(applet),
            "This is the title text");
        dialog.setResizable(false);
        dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dialog.pack();
        dialog.setLocationRelativeTo(null);
        dialog.setVisible(true);
        // Modal dialog blocks on the previous line; at this point I can
        // examine getValue() and make decisions, etc, etc.
    }
}

何かが明らかになるかもしれないと期待して、私は約1時間Googleに寄り添いましたが、これについての言及は見つかりませんでした. これは Firefox のことですか、それとも JRE のことですか? または、より良い質問: 一部のダイアログでは警告アイコンが表示され、他のダイアログでは表示されない原因は何ですか?

4

1 に答える 1

1

さて、私はばかげていると感じています。私はこれで数時間遊んでいましたが、どこにも行きませんでした。ここに質問を投稿し、14杯目のコーヒーを取りに行きました.クリームをかき混ぜているときに答えが私に来ました. 違いは次のとおりです。

ユーザーが署名付きアプレット ウィジェットをクリックして直接トリガーされるポップアップは「通常」です。

ユーザーが HTML/JavaScript オブジェクトをクリックしてトリガーされたポップアップ、および署名付き Java 関数を呼び出す「onclick」スクリプトには、警告のフラグが立てられます。

JavaScript 関数が署名付きアプレットを呼び出すと、アプレットは呼び出しの間、署名なしとして扱われます。これはおそらく同様の予防策が講じられていますが、実際には確認していません。解決策はどちらの場合も同じです。「いいえ、これは安全です」ステータスを必要とする最小のコードを見つけて、それをラップPrivilegedExceptionActionします。または、少なくとも、それは他の javascript-into-signed-applet 呼び出しの正しい解決策であるため、ここで試してみましたが、うまくいきました。:-)

実際のコードでは、ダイアログを表示する部分 (createDialog以降) は独自の関数にあります。AccessController.doPrivileged()その関数への呼び出しを、その関数へのラップされた呼び出しに置き換えると、すべてが処理されます。もう警告アイコンはありません!

于 2013-01-22T23:25:49.727 に答える