我有一个Spring-MVC应用程序,Freemarker作为视图组件。
在我的模板中,会生成几个指向我的应用程序的链接,其中包含包含哈希键(#
)的URL参数。
示例:
参数:Q#106368 11
Freemarker使用编码参数生成的网址:testurl.html?key=Q%23106368%2011
我使用JavaScript重定向到此URL(原因:我使用JS同时管理2帧的加载)。
重定向方法很简单:
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$$$
,在模板中再次在服务器端进行替换。但是我有很多地方要改变......
答案 0 :(得分:11)
正如Marc B评论的那样,有必要再次进行URL编码。方法是encodeURI()
。但是,此方法不会对#
符号进行编码。对于我的具体用例,我必须在编码后用#
替换%23
符号。
重定向JS方法最终看起来像:
function redir(url) {
url = encodeURI(url);
url = url.replace(/#/g, '%23');
window.location.href = url;
}
答案 1 :(得分: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
。
答案 2 :(得分:2)
encodeURIComponent / decodeURIComponent比encodeURI更彻底,它将解码/编码&#39;#&#39;和事件&#39; /&#39;