我正在尝试使用s:url
标记使用scheme
标记构建一些网址,其值在某些条件下会动态变化(例如,对于某些标准,将使用http
构建相同的网址请求和其他人https
)。对于给定的请求,应用中的所有s:url
都将使用http
或https
构建。
我已经为这个标准编写了逻辑,并将要使用的模式(http
或https
)存储为我的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
。
答案 0 :(得分:2)
当我更新问题时,我找到了答案。
我的发现是:
scheme
标记中的s:url
属性不支持表达式,只支持文字值。所以我做了什么:
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变量。