Web アプリケーションの構成を最小限に抑えようとしていますが、削除したいものの 1 つはポート番号のマッピングです。
- http: 80 -> https: 443
- http: 9080 -> https: 9443
構成は conf/server.xml に既に存在するため、アプリでこれらの設定を複製したくありません。複数の設定ファイルを変更しなければならない (そして忘れずに変更しなければならない) のは面倒です。また、アプリは、http と https をサポートしている限り、デプロイされた環境/コンテナーを気にする必要はありません。
web.xml で次のように構成していますが、リダイレクトに加えて https URL を構築できる必要があります。
<security-constraint>
<web-resource-collection>
<web-resource-name>secure</web-resource-name>
<url-pattern>/https/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
上記のブロックは、サーブレット コンテナーに、http 要求を対応する https にリダイレクトするように指示します。明らかに、Tomcat は要求の送信元のコネクタを認識し、server.xml でそのコネクタの「redirectPort」属性を検索し、それを使用して https URL を構築します。
これらの以前の/関連する質問によると、リクエストに対応する https ポートを取得する標準または tomcat 固有の方法はないようです。
TL;DR: 私の質問は、Web アプリケーションで明示的に構成せずに、安全でない要求に対応する https ポート番号を取得するためのアイデアはありますか?
私が持っている 1 つのアイデアは、現在の要求と同じポート番号を使用して、webapp からそれ自体への http 呼び出しをセキュリティ制約の背後のパスに作成し、応答からリダイレクトの場所を解析することです。もちろん、応答はキャッシュする必要があります。もっと簡単な方法はありますか?
編集:アイデアのコードを含む回答を追加しました。