2013-03-22 70 views
3

我试图使用s:url标记使用scheme属性构建一些URL,其值根据某些条件动态变化(例如,对于某些请求,将使用http构建相同的URL,对于其他https)。所有s:url在应用程序将建成要么httphttps对于给定的请求。如何在s:url标签中设置动态方案属性?

我已经设定了这一标准的逻辑和存储使用模式(httphttps)在我操作的字符串领域,但似乎我不能在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的。

回答

2

我找到了答案,我一走近时,我更新的问题。

我的发现是:

  • s:url标签的scheme属性不表示支持,只有文字值。
  • 我需要更改Struts2的默认行为。

所以我做了什么:

  • 删除在所有JSP所有s:url标签的所有scheme属性在我的应用程序。
  • 实施UrlRenderer与自定义类,几乎使用ServletUrlRenderer副本。我更改了renderUrl方法检索该方案的默认值的行:String scheme = ActionContext.getContext().getValueStack().findString("scheme");。这将该方案的默认值设置为当前操作的“scheme”属性。
  • 将以下属性添加到struts.properties。这个属性告诉Struts2的使用个性化的实现:

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

这种解决方案引入可维护性的问题,因为我从2.3.8版本的Struts的复制粘贴一些代码。如果有人有更好的解决方案,我会很乐意去测试它:)

+1

这可能是应用程序中的安全漏洞,最好是请求更改在标签 – 2013-03-25 09:37:18

+0

@LukaszLenart感谢您的评论,我正在考虑更改要使用的协议的位置,因此使用“scheme”参数所做的任何请求都不会改变应用程序的预期行为。无论如何,我与系统管理员和CIO制定的指导方针相关,所以我只是想确保我的应用程序生成“https”链接,尽管架构不太好。 – orique 2013-03-25 09:49:42

+1

请注册的问题,这是一个有效的用法案例:-) https://issues.apache.org/jira/browse/WW – 2013-03-25 11:47:45

0

很难弄清楚这一个...尝试用S:设置来设置myscheme的价值和使用JSP变量。

+0

感谢panky1986,试过但没有运气:( – orique 2013-03-22 14:52:54

相关问题