【发布时间】:2010-11-01 06:03:21
【问题描述】:
假设我有像 '=&?/;#+%' 这样的字符串作为我的 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 响应,except 当路径中有 %2F 时。在那种情况下,请求永远不会命中 servlet,我得到 404!如果我输入 '/' 而不是 %2F 它可以正常工作。我在 Linux 上的 Java 1.6.0-04 上运行 Tomcat 6.0.14。
【问题讨论】:
-
如果字符串已经被解码,为什么它会有一个 %2f 呢?
-
返回的值是什么样的,你希望它是什么?它是否相关?我真的不知道问题出在哪里。
-
听起来像是试图解码非法和格式错误的 URL。像这样在规范之外运行可能会导致一系列问题。您可以控制更改数据传递的方式吗?例如转移到发布数据?
-
对于任何在未来偶然发现此问题的人,%2F 的问题是由于CGI security precaution。
标签: java url servlets encode decode