我正在尝试s:url
使用该属性的标签构建一些 URL scheme
,其值根据某些条件动态变化(例如,http
对于某些请求和https
其他一些请求,将构建相同的 URL)。应用程序中的所有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
方法,我将能够做我想做的事。但我不知道如何告诉 Struts2 使用我的自定义实现UrlRenderer
而不是默认的ServletUrlRenderer
.