- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试使用 s:url
标签和 scheme
属性构建一些 URL,其值根据某些条件动态变化(例如,将构建相同的 URL一些请求使用 http
,另一些请求使用 https
)。对于给定的请求,应用程序中的所有 s:url
都将使用 http
或 https
构建。
我已经为这个标准编写了逻辑并将要使用的模式(http
或 https
)存储为我的 Action 中的字符串字段,但似乎我不能'在 s:url
标签的 scheme
属性中使用表达式:
当我尝试使用以此构建的 URL 呈现 HTML anchor 时:
<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
。
最佳答案
我找到了答案,因为我在更新问题时取得了进步。
我的发现是:
s:url
标签中的scheme
属性不支持表达式,只支持文字值。所以我做了什么:
s:url
标记中的所有 scheme
属性。UrlRenderer
,几乎使用了 ServletUrlRenderer
的副本。我更改了 renderUrl
方法检索方案默认值的行:String scheme = ActionContext.getContext().getValueStack().findString("scheme");
。这会将方案的默认值设置为当前操作的“方案”属性。struts.properties
。此属性告诉 Struts2 使用我的自定义实现:struts.urlRenderer = fully.qualified.name.for.my.CustomUrlRendererImplementation
此解决方案引入了可维护性问题,因为我从 2.3.8 版本的 Struts 中复制粘贴了一些代码。如果有人提供更好的解决方案,我会很乐意对其进行测试:)
关于java - 如何在 s :url tag? 中动态设置方案属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15569532/
我是一名优秀的程序员,十分优秀!