1

Tomcat 5.5 で Java アプレットを実行しています。署名されています (-selfcert)。java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)アプレットが Web サービスに接続しようとすると、まだ例外が発生します (既にこの行にあります)。

ws_locator = new My_WebserviceLocator(ws_adress + "?wsdl",
                new javax.xml.namespace.QName("http://impl.webservice", "My_Webservice"));

ここにいくつかの同様の質問があるので、私はそれらを読みました:

  • はい、アプレットは署名されています。-verifyで確認しました。

  • Tomcat のセキュリティ例外かもしれませんが、catalina.policy に追加しました:

    grant codeBase "file:/home/me/apache-tomcat-5.5.27/webapps/myapplet/-" {
        permission java.security.AllPermission;    };
    

    grant codeBase "file:/home/me/apache-tomcat-5.5.27/webapps/myapplet/applet.jar" { permission java.security.AllPermission; };

そして、次のような通常のものもそこにあります:

grant codeBase "file:${java.home}/jre/lib/ext/-" {
        permission java.security.AllPermission;
};

結果なし。

OK、簡単な更新、追加:

grant{
        permission java.security.AllPermission;
};

ローカルの java.policy ファイルに追加すると、問題が修正されます。しかし、それは私が探しているものではありません。アプレットは、dafault java.policy ファイルを使用して、平均的なマシンで実行する必要があります。したがって、コード内から修正する必要があります。

4

4 に答える 4

8

アプレットのメイン スレッドから WS を呼び出しますか、それとも JavaScript を使用したアプレットのメソッドへの呼び出しによって開始されるスレッドから WS を呼び出しますか?

以下の例を参照してください。

それが役に立てば幸い。

public class MyApplet extends JApplet {

    @Override
    public void start() {
        // It will work if your applet is signed
        callWebService();
    }

    public void methodCalledFromJavascriptWrong() {
        // It will NOT work even if your applet is signed
        callWebService();

    }

    public void methodCalledFromJavascriptGood() {
        AccessController.doPrivileged(new PrivilegedAction() {

            public Object run() {
                // It will work if your applet is signed
                callWebService();
                return null;
            }

        });

    }

    private void callWebService() {
        //Here you call your web service
    }
}
于 2009-10-16T13:12:23.850 に答える
0

サーバーに権限を設定することは解決策ではありません。不平を言うのはブラウザのセキュリティマネージャです。

提案されているAccessManagerの使用は必須であり、そうでない場合は失敗します。ただし、start()またはinit()からWebサービスを呼び出す場合も同じことを行う必要があります。

質問できますか:WebService呼び出しが、アプレットを持っている唯一の理由ですか?同一生成元ポリシーの制限を回避するために、プロキシサーブレットを配置する方がよい場合があります。次に、ブラウザで純粋なHTML+Javascriptを使用できます。

JSからアプレットを呼び出すと、アプレットが完全に開始される前に呼び出すと失敗する可能性があるため、アプレットの準備ができるまで待つ必要があります。

于 2009-11-27T14:49:29.517 に答える
0

アプレットから、制限されたリソースと相互作用する他のライブラリ (jar) を使用している場合は、それらも署名する必要があります。したがって、スタックトレース全体と My_WebserviceLocator を提供します。(アンダースコアは使用しないでください)。たとえば、axis.jar に署名してみてください。

于 2009-11-22T17:10:24.163 に答える
0

一時的な回避策として、SecurityManager を無効にすることができます。もちろん、これにはいくつかのセキュリティ上の問題がありますが、少なくとも SecurityManager (つまり、権限の問題) まで突き止めることができます。

System.setSecurityManager(null);

これが実際に機能する場合、私の推測では、間違ったポリシー ファイルを構成していると思われます。ブラウザーからアプレットを実行する場合、JDK にバンドルされている JRE ではなく、アプレット ランチャーが通常のコンシューマー JRE になることはほぼ確実です。

于 2009-11-27T13:56:01.260 に答える