【问题标题】:What is the behavior of Hash(#) in query string查询字符串中 Hash(#) 的行为是什么
【发布时间】:2017-09-12 22:06:53
【问题描述】:

我正在发送带有查询字符串的以下网址。在查询字符串一个参数 "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

如果我从查询字符串中删除 hash(#) 或者如果我用 %23 替换 # 一切正常

如果另一个参数包含哈希 (#) 符号,我不明白为什么一个参数为空。

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

【问题讨论】:

标签: java url web-applications url-encoding


【解决方案1】:

这被称为“片段标识符”。

wikipedia中所述:

井号# 引入的fragment identifier 是文档URL 的可选最后部分。它通常用于标识该文档的一部分。

# 之后的部分是client 的信息。它不会发送到服务器。把只有浏览器需要的所有东西放在这里。

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

【讨论】:

  • 值得一提的是,在这个字符(如果未编码)之后的所有内容都不会发送到服务器,而只能用于客户端,这说明了 OP 的问题。
【解决方案2】:

Hash值是给锚点的,所以它只是客户端的,它经常用在客户端框架中,比如angular,用于客户端路由。

锚点在服务器端不可用。

在您的情况下,您不需要锚点,而是带有 # 的参数值打破查询字符串,该值是“事务日志 #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 将正常解码它,或者按照 cmets 中的建议使用 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 编码之间的区别

【讨论】:

  • encodeURI 不适用于/ ? : @ & = + $ # 你需要使用encodeURIComponent
  • 谢谢:所以 Stange 在 Java 和 Javascript 中的行为是不同的,我会更新我的答案
【解决方案3】:

哈希是一个锚:

更多信息请参见wikipedia

【讨论】:

    猜你喜欢
    • 2010-10-18
    • 1970-01-01
    • 2010-12-02
    • 2012-11-02
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    相关资源
    最近更新 更多