查询字符串中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编码之间的区别
哈希是一个锚点:
有关更多信息,请参阅维基百科