您好我正在为HTTP Server提供嵌入式Jetty
出于某种原因,必须通过包含带点的郊区接收一些请求。 示例:http://127.0.0.1:10000/./test/
但是当我从码头检索郊区时,点会自动替换。
有没有办法停止更换?
由于 宰
答案 0 :(得分:0)
这是servlet规范的一个黑暗角落,没有明确定义(最近有2个月前有had discussion on the servlet spec experts group mailing list!)
规范说传入的URL必须在与contextPath或urlPattern匹配之前进行“规范化”。
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
上下文/foo/context/.//..%2F..//./%62%61%72/context/servlet/info
/context/.//..%2F..//./%62%61%72/context/servlet/info
该规范的丑陋部分对安全工作非常敌视,可能会在Servlet 4.0中得到改进/澄清