查询字符串中Hash(#)的行为是什么

时间:2015-04-24 07:21:17

标签: java url web-applications url-encoding

我发送带有查询字符串的以下网址。在查询字符串中有一个参数         “approverCmt”具有哈希值(#)。

    "/abc/efd/xyz.jas?approverCmt=Transaction Log #459505&batchNm=XS_10APR2015_082224&mfrNm=Timberland"

在服务器端,当我尝试从请求中检索它时

    approverCmt = Transaction Log  -----> "#459505" is missing
    batchNm = null
    mfrNm = null

如果我从查询字符串中删除哈希(#)或如果我用%23替换#,那么每件事都可以正常工作

如果另一个参数包含一个哈希(#)符号,我不明白为什么我为一个参数获取null。

感谢是否可以解释。

3 个答案:

答案 0 :(得分:12)

这称为“片段标识符”。

wikipedia中所述:

  

哈希标记#引入的fragment identifier是文档URL的可选最后一部分。它通常用于标识该文档的一部分。

#之后的部分是client的信息。它不会发送到服务器。在这里只放置浏览器所需的一切。

您可以使用JavaScript中的encodeURIComponent()函数对网址中的特殊字符进行编码,以便将#个字符转换为其他字符,这样您就可以确保将整个网址发送到服务器

答案 1 :(得分:2)

哈希值用于锚点,因此它只是客户端,它通常用于客户端框架,如客户端路由的角度。

锚点在服务器端不可用。

在您的情况下,您不需要锚点,但带#的参数值会破坏查询字符串,值为"事务日志#459505"。

编辑天真的解决方案并不起作用,只需将其用于历史记录,请参阅下面的真实解决方案

解决方案是编码客户端和解码服务器端

在javascript中编码

   encodeURI("Transaction Log #459505")
   //result value "Transaction%20Log%20#459505"

在Java中解码

 java.net.URLDecoder.decode("Transaction%20Log%20#459505");
  //result  "Transaction Log #459505"

编辑:但是:Javascript的编码方式与Java相同 所以正确答案(我希望)是手动替换所有#with%23,然后Java会正常解码,或者按照注释中的建议使用encodeURIComponent。根据您的需要,替换解决方案似乎已经足够了。

在Javascript中编码:

encodeURI("yourUrl/Transaction Log #459505").replace(/#/,"%23")
//result: yourUrl/Transaction%20Log%20%23459505

Java中的解码不会改变

java.net.URLDecoder.decode("Transaction%20Log%20#459505")
// result (java.lang.String) Transaction Log #459505

很抱歉很长的帖子,我没有看到Java和JavaScrip Url编码之间的差异

答案 2 :(得分:1)

哈希是一个锚:

有关详细信息,请参阅wikipedia