我試圖使用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