我发送带有查询字符串的以下网址。在查询字符串中有一个参数 “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。
感谢是否可以解释。
答案 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