如何在URL参数中提交哈希键?

How can I submit a hash key in an URL parameter?

本文关键字:提交 哈希键 参数 URL      更新时间:2023-09-26

我有一个Spring-MVC应用程序,其中Freemarker作为视图组件。

在我的模板中,生成了几个指向我的应用程序的链接,这些链接包括包含散列键(#)的URL参数。

的例子:

参数:Q#106368 11

由Freemarker生成的URL,编码参数: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$$$,并再次在服务器端进行替换。但是有很多地方需要修改

如Marc B所述,需要重新进行URL编码。方法是encodeURI()。但是,此方法不编码#符号。对于我的特定用例,我必须将编码后的#符号替换为%23

重定向JS方法最终看起来像:

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

比较escape()、encodeURI()和encodeuriccomponent ()

encodeuriccomponent/decodeuriccomponent比encodeURI更彻底,它将解码/编码'#'和事件'/'

您使用的是什么浏览器?我正在尝试FireFox 5,在我的测试中它不能将%23转换回#。当你把鼠标移到链接上或复制链接位置时,它有什么?你确定输出链接的东西没有进行转换吗?

这是不理想的,但它似乎解决了问题:

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

似乎href属性被解码了。当我把鼠标移到它上面时,我看到的是#而不是%23