Appletは署名しているがRuntime.getRuntime().exec(cmd)異常:java.security.AccessControlException:access deni


注意:本文は“阿飛”のブログから出て、もしこの文章を転載するならば、作者と連絡してください!
ソースを明記します. http://blog.csdn.net/faye0412/article/details/7037078
この2,3日、突然cs部門から1つのプロジェクトに問題があったというフィードバックがありました.見てみると、おおお、数年前に作ったAppletのプロジェクトで、クライアントでどんなブラウザを使っても正常に動作しないという異常情報をチェックしました.java.security.AccessControlException:access denied(java.io.FilePermission"<>>>"、「execute」).......<その他の情報は省略>
この問題は開発の時にもあったが、サインして解決したが、最近はなぜまた出てきたのだろうか.おかしい...
私はまたN台の機械を探して、異なるバージョンのブラウザ(ie 7、8、9...Cheome、Firefox....)はすべて1回測定して1つの問題を発見しました:
1.ブラウザとは関係なく、jreのバージョンと関係がある.
2.jreバージョンが1.6.0より高い20のはすべて正常に運行することができなくて、このバージョンより低いのはすべて正常に運行することができます(私のはJREバージョン1.6.0_29-b 11で、運行できません);
どのように解決しますか?そこで、OracleのN関連ドキュメントを探しました.たとえば、次のようにします.
http://java.sun.com/developer/onlineTraining/Programming/JDCBook/signed.html(署名Applet)
http://docs.oracle.com/javase/1.4.2/docs/guide/security/permissions.html(Permissions in the JavaTM 2 SDK)
待って、何も進展していません.次の方法を試しました.
1.プライベートpolicyファイルを定義する方法;
2.Javaデフォルトのセキュリティポリシーファイル(あまり安全ではありません)、${java.home}/lib/security/java.securityファイルを変更し、ライセンス方式を追加します.
役に立たない(私が間違っているかもしれませんが?)しかし、私たちはすべてのお客様に自分のセキュリティポリシーファイルを修正させることはできません.結局、誰もがそんなに専門的ではありません.お客様もこのような方法を受け入れたくありません.
問題解決:
その後、ドキュメントをめくった後、アクセスコントローラ.doPrivilegedを使用してコード権限を向上させるという重要な方法を発見しました.クライアントがJREのセキュリティ構成を変更することを望まない場合は、コードの中で昇格することを選択することができますが、これは私が期待しています!
クライアントがポップアップするjdkのダイアログボックスでは、ユーザーが信頼をクリックしてボタンを実行するだけで、つまりこの署名を信頼すれば、このコードを実行することができます:AccessController.doPrivileged(...)、Applet権限も向上します.
具体例のコードは次のとおりです.
private String runCmd(){
	String result = AccessController.doPrivileged(new PrivilegedAction<String>() {  
        @Override  
        public String run() {
            	String res = null;
		//TODO like 'Runtime.getRuntime().exec(cmd)' etc.....
                return res;  
            }
        });
	return result;
}

これで、簡単な一言で終わりました...
最後にjarパッケージを再入力し、署名し、証明書とkeystoreファイル、jarファイルをサーバテストに再パブリッシュする必要があることを忘れないでください:)
補足:
以前にも「JSがAppletの実行権限を呼び出すことについて」という記事を書いたことがあります(http://blog.csdn.net/faye0412/article/details/4566400)、SwingUtilities.invokeLater(new Runnable()の使用について言及しています....の方法ですが、この方法は前の署名とAppletの仮死の状況しか解決できず、今出会ったこのような状況を解決できないので、この2つの方法を組み合わせて使うのが一番です.問題は完璧に解決します!!