3

s:url属性を使用してタグを使用していくつかのURLを構築しようとしていschemeます。その値は、いくつかの基準で動的に変化します(たとえば、同じURLがhttpいくつかのリクエストとhttps他のリクエストで構築されます)。アプリケーションのすべては、特定のリクエストを使用して、または特定のリクエストに対してs:urlビルドされます。httphttps

この基準のロジックをプログラムし、使用するスキーマ(httpまたは)をアクションの文字列フィールドとして保存しましたが、タグの属性でhttps式を使用できないようです。schemes: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

4

2 に答える 2

2

質問を更新したときに進んだときに、答えが見つかりました。

私の調査結果は次のとおりです。

  • タグのscheme属性はs:url式をサポートせず、リテラル値のみをサポートします。
  • Struts2のデフォルトの動作を変更する必要がありました。

だから私がしたこと:

  • アプリケーションのすべてのJSPのすべてのタグのすべてのscheme属性を削除しました。s:url
  • UrlRendererのほぼコピーを使用して、カスタムクラスで実装されますServletUrlRendererrenderUrlメソッドがスキームのデフォルト値を取得する行を次のように変更しましたString scheme = ActionContext.getContext().getValueStack().findString("scheme");。これにより、スキームのデフォルト値が現在のアクションの「スキーム」プロパティとして設定されます。
  • 次のプロパティをに追加しましたstruts.properties。このプロパティは、Struts2にカスタム実装を使用するように指示します。

struts.urlRenderer = fully.qualified.name.for.my.CustomUrlRendererImplementation

このソリューションでは、Strutsの2.3.8バージョンから一部のコードをコピーして貼り付けたため、保守性の問題が発生します。より良い解決策を持っている人がいれば、喜んでテストします:)

于 2013-03-22T15:33:33.507 に答える
0

これを理解するのは難しいです...s:setを試してmyschemeの値を設定し、jsp変数を使用してください。

于 2013-03-22T12:37:54.640 に答える