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

我发送带有查询字符串的以下url。 在查询字符串中,一个参数“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。

感谢任何人都可以解释。

这被称为“片段标识符”。

正如维基百科所述 :

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

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

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

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

锚点在服务器端不可用。

在您的情况下,您不需要锚,但带#的参数值会破坏查询字符串,其值为“Transaction Log#459505”。

编辑Naive解决方案不起作用,只需让它历史记录,请参阅下面的真实解决方案

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

在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 

很抱歉很长的post,我没有看到Java和JavaScrip Url编码之间的区别

哈希是一个锚点:

有关更多信息,请参阅维基百科