以下にいくつかのオプションの概要を示します。
リバースプロキシを設定する
ServletRequestのJavadocによると、HttpServletRequest.getServerName()は次のようになります。
ホストヘッダー値の「:」の前の部分の値(存在する場合)、または解決されたサーバー名、またはサーバーのIPアドレス。
これは、ホストヘッダーが適切に設定されるようにプロキシーを構成できることを意味します(ただし、WebSphereなどの一部のコンテナーは仕様を尊重しません)。
コンテナ構成を使用してオーバーライド
多くのサーバーには、リバースプロキシを使用している場合にこの値を上書きできる設定があります。Springフォーラムにはかなりまともなスレッドがあり、以下に要約した情報がもう少しあります。
Tomcatを使用している場合は、リバースプロキシの設定ページを参照してください。構成の1つの方法は、HttpServletRequest.getServerName()によって返される値をオーバーライドするproxyName属性と、HttpServletRequest.getServerPort()によって返される値をオーバーライドするproxyPortを持つようにHttpコネクターを構成することです。構成例は次のようになります。
server.xml
<Connector scheme="https" secure="true"
proxyPort="443" proxyName="example.com"
port="8009" protocol="AJP/1.3"
redirectPort="8443" maxThreads="750"
connectionTimeout="20000" />
Websphereには、同じことを行うカスタムプロパティがいくつかあります。
com.ibm.ws.webcontainer.extractHostHeaderPort = true
trusthostheaderport = true
httpsIndicatorHeader = com.ibm.ws.httpsIndicatorHeader
これらのコンテナのいずれも使用していない場合、または複数のドメインをサポートする必要がある場合は、コンテナのドキュメントを参照する必要があります。
カスタムAuthenticationDetailsSource
もちろん、Spring Securityは非常に柔軟性があるため、任意の方法でサービスURLを検索するServiceAuthenticationDetailsのインスタンスを返すAuthenticationDetailsSourceのカスタム実装をいつでも提供できます。