2013-03-22 204 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