嵌入式 Jetty 取代 suburl

Embedded Jetty replacing suburl

您好,我正在为 HTTP 服务器提供嵌入式 Jetty

出于某种原因,某些请求必须使用包含点的 suburl 来接收。 示例:http://127.0.0.1:10000/./test/

但是当我从 jetty 检索 suburl 时,该点会被自动替换。

有什么办法可以停止替换吗?

谢谢 载

这是 servlet 规范的一个暗角,定义不明确(最近 had discussion on the servlet spec experts group mailing list 2 个月前!)

规范规定,在与 contextPath 或 urlPattern 匹配之前,传入的 URL 必须是 "normalized"。

规范化 URI/URL 出于多种原因(规范要求、安全性、防止上下文之外的访问、清理目录遍历、正确应用约束等)

规范化的事物(假设在 /foo/bar 以及 / 部署了 3 个上下文):

  • /foo -> /foo/
  • /foo/../bar/ -> /bar/
  • /foo/../../../etc/passwd -> /etc/passwd
  • /foo/css//main.css -> /foo/css/main.css
  • /foo/app/./css/./widget.css -> /foo/app/css/widget.css

然后拿下这个怪物...

  • /foo/context/.//..%2F..//./%62%61%72/context/servlet/info -> ??

Jetty 目前将其规范化为 /bar/context/servlet/info,但对 servlet 规范的最严格解释(在 servlet 规范实施者中非常不受欢迎的解释!)说它应该:

  • 匹配/foo上下文
  • getContextPath() returns /foo/context/.//..%2F..//./%62%61%72/context/servlet/info
  • getPathInfo() returns /context/.//..%2F..//./%62%61%72/context/servlet/info

规范中这个丑陋的部分对安全工作非常不利,很可能 refined/clarified 在 Servlet 4.0