Java 查询字符串中散列(#)的行为是什么

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

我正在发送以下带有查询字符串的url。在查询字符串中,输入一个参数 “approverCmt”的值带有散列(#)

在服务器端,当我试图从我得到的请求中检索它时

    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