我试图使用s:url
标记使用scheme
属性构建一些URL,其值根据某些条件动态变化(例如,对于某些请求,将使用http
构建相同的URL,对于其他https
)。所有s:url
在应用程序将建成要么http
或https
对于给定的请求。如何在s:url标签中设置动态方案属性?
我已经设定了这一标准的逻辑和存储使用模式(http
或https
)在我操作的字符串领域,但似乎我不能在s:url
标签的scheme
属性使用表达式:
当我尝试使用这个内置的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
流量。
应用程序中的链接必须在通过负载平衡器请求时(使互联网用户受到保护)以及直接请求时(当我们的开发人员需要访问特定前端我们的内部网络)。我无法控制服务器配置,也没有太多影响系统管理员,所以更改服务器或网络配置似乎相当有问题。
UPDATE
看来,如果我延长org.apache.struts2.components.ServletUrlRenderer
Struts2的类中重写renderUrl
方法我就能够做我想做的。但我不知道我怎么会告诉Struts2中使用的UrlRenderer
我的自定义实现,而不是默认ServletUrlRenderer
的。
这可能是应用程序中的安全漏洞,最好是请求更改在 标签 –
2013-03-25 09:37:18
@LukaszLenart感谢您的评论,我正在考虑更改要使用的协议的位置,因此使用“scheme”参数所做的任何请求都不会改变应用程序的预期行为。无论如何,我与系统管理员和CIO制定的指导方针相关,所以我只是想确保我的应用程序生成“https”链接,尽管架构不太好。 – orique 2013-03-25 09:49:42
请注册 的问题,这是一个有效的用法案例:-) https://issues.apache.org/jira/browse/WW –
2013-03-25 11:47:45