【问题标题】:Limitation of path in SpringSpring中路径的限制
【发布时间】:2017-08-02 11:08:54
【问题描述】:

我在使用 Spring 和 REST API 时遇到了一个有趣的问题,这个问题是:Spring 中的路径是否限制为一定数量的字符?

代码如下

@RequestMapping(value = {REST_PREFIX + "/{key}"}, method = {RequestMethod.GET})
public DashboardItem getExceptionByKey(@PathVariable("key") String key, HttpServletRequest request, HttpServletResponse httpResponse_p) {
    log.info("URL is {}", request.getRequestURL());
    log.info("Key is {}", key);
    return InspectionUtils.getExceptionByKey(key);
}

一个键的例子是

67E4D2C089CBCCA2A9732F6986124C6B10.243.2.107#0EEE5EAB06ED4FFF82A8934F7058860C#79A2F0C170A028A3B0410F0F16303F41

发送请求时,我确保对 URL 进行编码,在我的程序中,我收到的 URL 如下

/rest/exceptions/67E4D2C089CBCCA2A9732F6986124C6B10.243.2.107#0EEE5EAB06ED4FFF82A8934F7058860C#79A2F0C170A028A3B0410F0F16303F41

因此我收到了孔键,但是当它解析它时,变量键只有

67E4D2C089CBCCA2A9732F6986124C6B10.243.2

我以为可能是特殊字符,但看起来不像。我的第二个猜测是路径的长度是有限制的。

所以我的问题是关于路径是否存在限制或是否还有其他问题?

谢谢

【问题讨论】:

  • 回答您的最后一个问题:是的,URL 长度是有限制的——浏览器将其限制为大约 2000 个字符。不,你在 Spring 中还没有达到这个限制。
  • 我知道 2000 个字符的限制。我指的是路径变量,如果它有限制
  • 没有限制。请告诉我们您在哪里确定密钥被切断,我没有看到打印语句,我只看到另一段可能或可能不正确处理密钥的代码 (InspectionUtils.getExceptionByKey(key))
  • 我的错。在那次通话之前,我正在打印密钥。我已经更新了原帖中的代码。

标签: java spring rest url path


【解决方案1】:

这是某种弹簧约定,它将最后一个点之后的所有内容视为文件扩展名并将其切断。您可以简单地尝试在请求映射和请求中添加尾随 /。 IE。 REST_PREFIX + "/{key}/"

如果您不是调用 API 的人,请参阅this question

,了解更复杂但更好的解决方案

【讨论】:

  • 谢谢。这是我一直在寻找的答案。它现在似乎可以工作了。
  • 很高兴我能帮上忙 :)
【解决方案2】:

它必须是您的key 中的哈希# 字符,它没有得到URL 编码。由于 URL 中 # 之后的任何内容都代表 HTML 页面的不同片段,因此它永远不会被发送到服务器。

关于在你的key 上使用 javascript 的 encodeURIComponent() 我得到了:

67E4D2C089CBCCA2A9732F6986124C6B10.243.2.107%230EEE5EAB06ED4FFF82A8934F7058860C%2379A2F0C170A028A3B0410F0F16303F41

注意# 字符现在已编码。试试这个,但您可能需要在您的服务器上对其进行解码。

【讨论】:

  • 我已经在我的 Javascript 代码中使用 encodedURIComponent() 对字符进行了编码,因为这是我的第一个问题。之后,在我的 Java 代码中,我收到的路径是正确的,但密钥被截断。它也会在服务器上自动解码。我的问题是它不是在 # 而是在之前被截断
  • 消除问题的根源。尝试从 PostMan 调用,查看 Web 服务器访问日志以查看实际发送的 URL。使您的端点REST_PREFIX + "/**" 并查看您获得的 URL。
  • 我已经这样做了,正如我之前提到的那样,我在记录它时在 Web 服务器上获取的 URL 很好,密钥是完整的。解析时,键在第三个点之前停止。
  • 然后记录您获得的密钥,或者按照我的建议将端点更改为/**。注入 HttpServletRequest 并打印 getURI 的内容。
  • 我还记录了密钥,正如我所说,密钥在第三个点之前被截断。我不想将端点更改为 /**,这会给我的其他代码带来问题。我发现的一种解决方法是使用查询参数,但我很好奇这个问题。
【解决方案3】:

# 字符在 URL 中具有特殊含义。它是一个片段标识符,用于跳转到页面的某个部分(而不是着陆在顶部)。为避免这种情况,请将字符编码为%23

【讨论】:

  • 这不是解决方案,因为您可以清楚地看到路径被截断。
  • 正如我在帖子中所说,字符在发送到服务器时正在被编码。
  • 查看我关于消除其他问题来源的评论。 Spring 不是切断您的 URL 的工具,因为我从经验中知道它可以处理的 URL 比这个长得多。
猜你喜欢
  • 2012-06-08
  • 2012-06-29
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
相关资源
最近更新 更多