【问题标题】:Why @PathVariable trims the data containing #? [duplicate]为什么@PathVariable 会修剪包含# 的数据? [复制]
【发布时间】:2020-09-25 05:04:57
【问题描述】:

我的自定义控制器中有一个URI 映射,如下所示:

http://localhost:8080/abc/{id}

现在,对于id 中的正常值,它不会造成任何问题。

当 id 包含 # 时,内容会被修剪。

例如:对于id = 123#qqq,则@PathVariable 变为123

如何解决这个问题?

【问题讨论】:

  • # 是一个特殊字符。你需要 uri 转义它。
  • 基本上,类似index.html#abc 的意思是index.html,id 为abc。查询字符串也是如此。
  • “#”不是一个锚点...资源中的一个位置,就像网页上的一个位置。?所以它被剥离了,因为它不是资源本身规范的一部分。也许这足以成为逃避它的理由。
  • 路径变量中的/ 也一样(解释)。虽然对于 URL 参数,可以在这里使用URLEncoder.encode(pathVar, "UTF-8"),但我肯定会避免使用有问题的字符。
  • 这是 URI 和 HTTP 工作方式的基础,与 Spring 无关。如果您检查“网络”选项卡,您会发现您的浏览器甚至没有传输该部分。

标签: java spring spring-restcontroller


【解决方案1】:

你基本上有两个选择:

1) 将id 保留为路径变量并转义#

正如 cmets 中已经提到的,# 是 URI 中的一个特殊字符,通常保留用于引用网页上的锚点位置。如果您想将其用作路径变量,则必须对其进行转义:

http://localhost:8080/abc/123%23qqq 

将产生您想要的id = 123#qqq

2) 改为使用请求参数

在我看来,这似乎是更清洁的解决方案。如果您必须将 # 作为您的 id 的一部分,您应该将其编码为请求参数中的字符串:

public void fooBar(@Requestparam String id) {
   // do stuff
}

这样您就不必担心 URI 编码,因为您的 # 字符将被解释为字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多