【问题标题】:Java URI doesn't encode semicolons in path. Best practice here?Java URI 不对路径中的分号进行编码。这里的最佳实践?
【发布时间】:2013-04-09 08:12:42
【问题描述】:

我正在开发一个通过 HTTP 导出本地文件的项目。这涉及获取文件 URI,使用导出的路径对其进行相对化,将其附加到导出 URI,然后在接收端将其作为 URL 处理。

通常这可以正常工作,但是当文件名包含分号时会遇到麻烦。我把范围缩小到这里:

new File(path).toURI()

上述方法正确编码了空格等,但不能正确编码分号(应编码为 %3B)。

上述方法最终返回URI构造函数(协议、主机、路径、片段)的结果,返回错误的URI。

我可以用 %3B 手动替换所有分号,但这并不是最好的解决方案。真的没有内置 API 可以正确编码路径吗?

非常感谢您的帮助。

【问题讨论】:

标签: java encoding uri


【解决方案1】:

分号是 URI 中完全有效的字符。当然,如果接收端使用分号作为特殊分隔符,发送端需要对其进行转义。但这超出了标准做法,所以你必须自己逃避它。

但是在java世界中,servlet是标准的,它使用分号作为特殊的分隔符。我不知道有任何实用程序可以帮助您,因此您仍然需要手动转义分号。

【讨论】:

  • 你说这是非标准的,但我不同意。如果您有 Web 服务器,请继续提供名为“foo;.html”的文件并尝试访问它。您的网络服务器会将文件导出为 foo%3B.html,并且在不使用编码的情况下访问它会导致 404。它是有效的,但不是路径的一部分。
  • servlet 服务器确实如此。
  • @AlexBroadwin - Apache 2.2 在提供名称中带有分号的文件时没有问题。我使用带有-v 选项的curl 对此进行了测试,HTTP 请求为GET /~dave/foo;bar.html,它返回了文件而没有发出警告。
  • 有趣,你是对的。 apache 创建的列表使用 %3B 对链接进行编码,但它使用分号正确地提供了它。也许只是 H2(实际使用的服务器)有问题......
  • 已确认。 Apache 提供服务,H2 不提供。
猜你喜欢
  • 2021-11-20
  • 2021-09-07
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
相关资源
最近更新 更多