s:url
属性を使用してタグを使用していくつかのURLを構築しようとしていscheme
ます。その値は、いくつかの基準で動的に変化します(たとえば、同じURLがhttp
いくつかのリクエストとhttps
他のリクエストで構築されます)。アプリケーションのすべては、特定のリクエストを使用して、または特定のリクエストに対してs:url
ビルドされます。http
https
この基準のロジックをプログラムし、使用するスキーマ(http
または)をアクションの文字列フィールドとして保存しましたが、タグの属性でhttps
式を使用できないようです。scheme
s:url
これで構築されたURLを使用してHTMLアンカーをレンダリングしようとすると:
<s:url scheme="%{myScheme}" id="myUrl" action="MyAction" includeParams="none">
<s:param name="someParam" value="blah"/>
</s:url>
<s:a href="%{myUrl}">click me</s:a>
私は得る:
<a href="%{myScheme}://myhost.com/mywebapp/MyAction.action?someParam=blah">click me</a>
また、実際のアクションプロパティを使用しなくても、醜いことをしようとしました(それが機能する場合は、実際の値のリテラルを変更します)。スクリプトレットを使用しようとしました:
<s:url scheme="<%= "https" %>" id="myUrl" action="MyAction" includeParams="none">
<s:param name="someParam" value="blah"/>
</s:url>
しかし、500
エラーとこのログメッセージが表示されます:
org.apache.jasper.JasperException: /path/to/my/file.jsp(123,456) According to TLD or attribute directive in tag file, attribute scheme does not accept any expressions
次の醜いオプションも試してみましたが、うまくいきませんでした。
<s:url scheme="<s:property value="myScheme"/>" id="myUrl" action="MyAction" includeParams="none">
<s:param name="someParam" value="blah"/>
</s:url>
と:
<s:url scheme="<c:out value="${myScheme}"/>" id="myUrl" action="MyAction" includeParams="none">
<s:param name="someParam" value="blah"/>
</s:url>
だから私はアイデアを使い果たしました。誰かが同じ問題に直面しましたか?質問の残りの部分では、なぜこれを行う必要があるのかを説明しています。
私のアプリケーションは、HTTPS要求を受信するロードバランサーの背後にありますが、HTTPを使用してアプリケーションサーバーに転送し、HTTPSを使用して応答をインターネットに送り返します。したがって、アプリケーションサーバーは常にHTTP
トラフィックを受信します。
アプリケーションのリンクは、ロードバランサーを介して要求された場合はhttpsスキームで生成する必要があり(インターネットのユーザーが保護されるため)、直接要求された場合はhttpで生成する必要があります(開発者が内部ネットワーク内の特定のフロントエンドにアクセスする必要がある場合)。 。サーバーの構成を制御することも、システム管理者に大きな影響を与えることもできないため、サーバーまたはネットワークの構成を変更するのはかなり問題があるようです。
アップデート
org.apache.struts2.components.ServletUrlRenderer
メソッドをオーバーライドしてStruts2クラスを拡張すると、renderUrl
やりたいことができるようになります。UrlRenderer
しかし、デフォルトの代わりにのカスタム実装を使用するようにStruts2に指示する方法がわかりませんServletUrlRenderer
。