Java 从 Servlet 读取未解码的 URL

标签 java url servlets encode decode

假设我有像 '=&?/;#+%' 这样的字符串作为我的 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/

相关文章:

java - Firefox 不会将此文件下载为 CSV

java - 从 sdcard 运行 FFmpeg 可执行文件

java - 通过选中另一列中的一项来启用和禁用 JTable 复选框

url - Grails-在操作完成之前捕获URL

java - wicket:根据请求将不同的路径映射到同一类以在标记中生成不同的内容

java - 动态使用 Java bean 和 Servlet 值

servlets - 在 Compojure 中使用 javax.servlet.Filter

java - hashCode() 的默认行为

java - 来自 Java 的 MySQL 查询错误

Android TextView 网址