Java从Servlet读取未解码的URL

Sla*_*ast 5 java url encode servlets decode

让我们假设我有像'=&?/;#+%'这样的字符串作为我网址的一部分,让我们这样说:

example.com/servletPath/someOtherPath/myString/something.html?a=b&c=d#asdf
Run Code Online (Sandbox Code Playgroud)

其中myString是上面的字符串.我编写了关键部分,因此URL看起来像

example.com/servletPath/someOtherPath/%3D%26%3F%2F%3B%23%2B%25/something.html?a=b&c=d#asdf
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.

当我在servlet中并且我读取任何一个request.getRequestURI(),request.getRequestURL()或者request.getPathInfo(),返回的值已经被解码,所以我得到了类似的strilng

someOtherPath/=&?/;#+%/something.html?a=b&c=d#asdf
Run Code Online (Sandbox Code Playgroud)

我无法区分真正的特殊字符和编码字符.

我通过完全禁止上面的字符解决了特殊的问题,这在这种情况下工作,但我仍然想知道有没有办法在servlet类中获取未解码的URL.

另一个编辑:当我昨晚遇到这个问题时,我太累了,无法注意到真正发生的事情,这更奇怪!我有servlet映射,比如说/ servletPath/*之后我可以放任何我想要的东西并让我的servlet响应路径的其余部分,除非路径中有%2F.在那种情况下,请求永远不会访问servlet,我得到404!如果我把'/'代替%2F它可以正常工作.我在Linux上运行Java 1.6.0-04上的Tomcat 6.0.14.

jcs*_*ica 22

浏览器和服务器的'%2F'和'/'之间存在根本区别.

HttpServletRequest规范说(没有任何逻辑,AFAICT):

  • getContextPath:未解码
  • getPathInfo:已解码
  • getPathTranslated:未解码
  • getQueryString:未解码
  • getRequestURI:未解码
  • getServletPath:已解码

getPathInfo的结果()应该被解码,但getRequestURI的()的结果不能被解码.如果是这样,你的Servlet容器就违反了规范(正如Wouter Coekaerts和Francois Gravel正确指出的那样).您运行的是哪个Tomcat版本?

更令人困惑的是,出于安全原因,当前的Tomcat版本会拒绝包含某些特殊字符编码的路径.