2011-07-08 57 views
5

我有一個以Freemarker作爲視圖組件的Spring-MVC應用程序。如何在URL參數中提交散列鍵?

在我的模板中,生成了幾個指向我的應用程序的鏈接,其中包含包含散列鍵(#)的URL參數。

實施例:

參數:testurl.html?key=Q%23106368%2011

我使用JavaScript來重定向到該URL(理由::我用JS管理2幀的加載通過Freemarker的具有編碼PARAM生成Q#106368 11

URL與此同時)。

重定向方法很簡單:

function redir(url) { 
     window.location.href = url; 
    } 

被FreeMarker產生的JS調用看起來像

<a href="javascript:redir('http://localhost:8080/testappp/testurl.html?key=Q%23106368%2011');">test</a> 

我的問題是,瀏覽器/ JavaScript的轉換回URL編碼的參數,認爲有一個#並在那裏切斷。

當我直接使用window.location.href='http://...'它的作品。只有在使用方法參數時,它似乎被神奇地URL解碼,然後重定向失敗,因爲URL在#被切斷。

有沒有簡單的方法來正確傳輸參數?

我知道我可以替換#,例如,與$$$hash$$$,在模板中並再次在服務器端進行替換。但有很多地方我不得不改變......

回答

7

正如Marc B所評論的,有必要再次進行URL編碼。該方法將是encodeURI()。但是,此方法不會編碼#符號。對於我的具體使用情況,我必須在編碼後用%23代替#

重定向JS方法終於看起來像:

function redir(url) { 
     url = encodeURI(url); 
     url = url.replace(/#/g, '%23'); 
     window.location.href = url; 
    } 

Comparing escape(), encodeURI(), and encodeURIComponent()

2

你使用什麼瀏覽器?我正在嘗試FireFox 5,並且在我的測試中它不會將%23轉換回#。當您將鼠標懸停在鏈接上或複製鏈接位置時,它具有什麼功能?你確定無論輸出鏈接是不是正在進行轉換嗎?

更新

這不是理想的,但現在看來似乎解決了這個問題:

<a onclick="url = 'http://localhost:8080/testappp/testurl.html?key=Q%23106368%2011';" href="javascript:redir(url);">test</a> 

這似乎是href屬性進行解碼。當我將鼠標移到它上面時,我看到了#而不是%23

+0

同意。任何瀏覽器*做*轉換這個逃生將是一個嚴重的廢話。 –

+0

即,複製鏈接位置或直接從代碼中檢查鏈接位置。 –

+0

感謝您的回覆。我仔細看了一下,我忘了提到一個非常重要的細節,但我從來沒有想過會這樣。我使用Javascript重定向方法,它發生在我使用這種方法時。當我將URL複製並粘貼到瀏覽器時,它工作正常。所以它不是Java/Spring /瀏覽器問題,它是一個Javascript問題。我已經更新了相應的問題。 – tvirtualw

0

encodeURIComponent方法/ decodeURIComponent更徹底不僅僅是是encodeURI,將解碼/編碼 '#' 和事件 '/'