假设我有像 '=&?/;#+%' 这样的字符串作为我的 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()
时,返回的值已经被解码,所以我会像
someOtherPath/=&?/;#+%/something.html?a=b&c=d#asdf
而且我无法区分真正的特殊字符和编码字符。
我通过完全禁止上面的字符解决了特定问题,这在这种情况下有效,但我仍然想知道有没有办法在 servlet 类中获取未解码的 URL。
另一个编辑:当我昨晚遇到这个问题时,我太累了,没有注意到真正发生了什么,这更奇怪!我已经映射了 servlet,比如 /servletPath/* 之后,我可以放置我想要的任何内容,并根据路径的其余部分让我的 servlet 响应,除非路径中有 %2F。在那种情况下,请求永远不会命中 servlet,我得到 404!如果我输入 '/' 而不是 %2F 它可以正常工作。我在 Linux 上的 Java 1.6.0-04 上运行 Tomcat 6.0.14。