Java 6 Update 31 を実行する Apache Tomcat 6 にデプロイされる Web アプリケーションを開発しています。今後の処理のために、ポート X で着信 TCP トラフィックを単にリッスンするモジュールを含める必要があります。Java Security Manager (IA 要件) を有効にするまで、すべてがうまく機能していました。
有効にすると、AccessControlExceptions が発生し始めましたが、ポリシー ファイルにこのトラフィックを明示的に許可しているものがないため、これは予期されたものでした。そこで、Tomcat の「catalina.policy」ファイルに次の行を追加しました (ここで、54321 はアプリがリッスンしているポートです)。
grant {
permission java.net.SocketPermission "*:54321", "accept, resolve";
};
ただし、次のような AccessControlExceptions がまだ表示されていました。
java.security.AccessControlException: access denied (java.net.SocketPermission 192.168.1.50:1527 accept,resolve)
そのエラー行を見て、「192.168.1.50」が実際にはクライアントの IP であることに気付きました。したがって、「1527」はソケットのクライアント側ポートでなければなりません。これは、これが試行されるたびにこのポートが変更されるという事実によって確認されます...
私の質問は、なぜ私の Web アプリケーションがクライアント ポートを気にする必要があるのかということです。私の理解では、発信接続は単に任意/ランダムなポートを使用するだけです。私の側では、このポリシー ファイルに関して、リッスンするポートを指定するだけでよいように思えます。ただし、これを機能させる唯一の方法は、上記の許可行で「54321」を「*」に変更して、JVM を世界中に開放することです。
ここで構文について何か誤解していますか? アプリケーションがサーバー ポート 54321 で、任意のホスト、任意のクライアント側ポートからの接続を受け入れるようにするにはどうすればよいですか?
ありがとう、ダグ