假设我有像 '=&?/;#+%' 这样的字符串作为我的 URL 的一部分,让我们这样说:
example.com/servletPath/someOtherPath/myString/something.html?a=b&c=d#asdf
其中 myString 是上面的字符串。我对关键部分进行了编码,因此 URL 看起来像
example.com/servletPath/someOtherPath/%3D%26%3F%2F%3B%23%2B%25/something.html?a=b&c=d#asdf
到目前为止一切顺利。
当我在 servlet 中读取任何 request.getRequestURI()
、request.getRequestURL()
或 request.getPathInfo()
,返回值已经解码,所以我得到了 strilng
someOtherPath/=&?/;#+%/something.html?a=b&c=d#asdf
而且我无法区分真正的特殊字符和编码字符。
我已经通过完全禁止上述字符解决了特定问题,这在这种情况下有效,但我仍然想知道是否有任何方法可以在 servlet 类中获取未解码的 URL。
还有一个编辑:当我昨晚遇到这个问题时,我太累了,没有注意到到底发生了什么,这更奇怪!我有 servlet 映射,比如/servletPath/* 之后,我可以放任何我想要的东西,让我的 servlet 根据路径的其余部分做出响应,except 当路径中有 %2F 时。在那种情况下,请求永远不会命中 servlet,我得到 404!如果我用 '/' 而不是 %2F 就可以了。我在 Linux 上的 Java 1.6.0-04 上运行 Tomcat 6.0.14。
最佳答案
对于浏览器和服务器,“%2F”和“/”之间存在根本区别。
HttpServletRequest 规范说(没有任何逻辑,AFAICT):
- getContextPath:未解码
- getPathInfo: 解码
- getPathTranslated:未解码
- getQueryString:未解码
- getRequestURI:未解码
- getServletPath: 解码
getPathInfo() 的结果应该 被解码,但是 getRequestURI() 的结果不能被解码。如果是,则您的 Servlet 容器违反了规范(正如 Wouter Coekaerts 和 Francois Gravel 正确指出的那样)。您运行的是哪个 Tomcat 版本?
让事情变得更加困惑的是,当前的 Tomcat 版本拒绝包含某些特殊字符编码的路径,for security reasons .
关于Java 从 Servlet 读取未解码的 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/966077/