Java 查询字符串中散列(#)的行为是什么
我正在发送以下带有查询字符串的url。在查询字符串中,输入一个参数 “approverCmt”的值带有散列(#) 在服务器端,当我试图从我得到的请求中检索它时Java 查询字符串中散列(#)的行为是什么,java,url,web-applications,url-encoding,Java,Url,Web Applications,Url Encoding,我正在发送以下带有查询字符串的url。在查询字符串中,输入一个参数 “approverCmt”的值带有散列(#) 在服务器端,当我试图从我得到的请求中检索它时 approverCmt = Transaction Log -----> "#459505" is missing batchNm = null mfrNm = null 如果我从查询字符串中删除散列(#),或者用%23替换#,一切都正常 我不明白,如果另一个参数包含散列(#)符号,为什么一个参数会为nu
approverCmt = Transaction Log -----> "#459505" is missing
batchNm = null
mfrNm = null
如果我从查询字符串中删除散列(#),或者用%23替换#,一切都正常
我不明白,如果另一个参数包含散列(#)符号,为什么一个参数会为null
感谢任何人的解释。散列是一个锚:
有关更多信息,请参见哈希值用于锚定,因此它仅用于客户端,通常在客户端框架中使用,例如用于客户端路由的angular 定位点在服务器端不可用 在本例中,您不需要锚定,但需要一个带有#break the query string的参数值,该值为“Transaction Log#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不同
所以正确的答案(我希望)是手动将所有的#替换为%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编码之间的区别,这就是所谓的“片段标识符”
如中所述:
散列标记引入的片段标识符
是文档的URL
的可选最后一部分。它通常用于标识该文档的一部分
后面的部分是客户端的信息。它不会发送到服务器。将浏览器需要的所有内容都放在此处
您可以使用JavaScript中的encodeURIComponent()
函数对URL中的特殊字符进行编码,这样#
字符就可以转换为其他字符,这样您就可以确保整个URL都会发送到服务器。请参阅,在这个字符之后放置的所有内容(如果未编码)也值得一提未发送到服务器,并且仅可用于解释OP问题的客户端。encodeURI
不适用于/?:@&=+$#
您需要使用encodeURIComponent
Thancks:因此,假设Java和Javascript中的行为不同,我将更新我的答案
java.net.URLDecoder.decode("Transaction%20Log%20#459505")
// result (java.lang.String) Transaction Log #459505