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

What is the behavior of Hash(#) in query string

我发送以下 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。

如果有人能解释一下,不胜感激。

哈希是一个锚点:

有关详细信息,请参阅 wikipedia

Hash值是针对anchor的,所以只是客户端的,经常用在客户端框架中,比如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"

编辑:但是:Java脚本的编码方式与Java不同 所以正确的答案(我希望)是用 %23 手动替换所有 #,然后 Java 将正常解码,或者按照评论中的建议使用 encodeURIComponent。对于您的需要,替换解决方案似乎就足够了。

在Java脚本中编码:

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 编码之间的区别

这被称为 "fragment identifier"。

wikipedia所述:

The fragment identifier introduced by a hash mark # is the optional last part of a URL for a document. It is typically used to identify a portion of that document.

# 之后的部分是 client 的信息。它不会发送到服务器。将浏览器需要的所有内容都放在这里。

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