如何在s:url标签中设置动态方案属性?

时间:2013-03-22 11:45:19

标签: java http https struts2

我正在尝试使用s:url标记使用scheme标记构建一些网址,其值在某些条件下会动态变化(例如,对于某些标准,将使用http构建相同的网址请求和其他人https)。对于给定的请求,应用中的所有s:url都将使用httphttps构建。

我已经为这个标准编写了逻辑,并将要使用的模式(httphttps)存储为我的Action中的String字段,但似乎我不能在{中使用表达式{1}}标记的{1}}属性:

当我尝试使用以下构建的URL呈现HTML锚点时:

scheme

我明白了:

s:url

还尝试做一件丑陋的事情,即使没有使用实际的动作属性(如果有效,我会更改实际值的文字)。试图使用scriptlet:

<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

所以我没有想法了。有没有人面临同样的问题?问题的其余部分解释了为什么我需要这样做:

我的应用程序位于接收HTTPS请求的负载均衡器后面,但是使用HTTP将它们转发到应用程序服务器,然后使用HTTPS将响应发送回互联网。因此,应用程序服务器始终会收到<s:url scheme="<s:property value="myScheme"/>" id="myUrl" action="MyAction" includeParams="none"> <s:param name="someParam" value="blah"/> </s:url> 个流量。

应用程序中的链接必须使用https方案生成,当通过负载均衡器请求时(因此互联网中的用户将受到保护),并且在直接请求时使用http(当我们的开发人员需要访问我们的特定前端时)内部网络)。我无法控制服务器配置,也无法控制系统管理员,因此更改服务器或网络配置似乎存在问题。

更新

似乎如果我扩展<s:url scheme="<c:out value="${myScheme}"/>" id="myUrl" action="MyAction" includeParams="none"> <s:param name="someParam" value="blah"/> </s:url> Struts2类重写HTTP方法,我就能做我想做的事。但我不知道如何告诉Struts2使用org.apache.struts2.components.ServletUrlRenderer的自定义实现而不是默认的renderUrl

2 个答案:

答案 0 :(得分:2)

当我更新问题时,我找到了答案。

我的发现是:

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

所以我做了什么:

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

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

此解决方案引入了可维护性问题,因为我从Struts的2.3.8版本中复制粘贴了一些代码。如果有人提供更好的解决方案,我将很乐意对其进行测试:)

答案 1 :(得分:0)

很难想到这一个...尝试用s:设置设置myscheme的值并使用jsp变量。