代码之家  ›  专栏  ›  技术社区  ›  Slartibartfast

Java从Servlet读取未解码的URL

  •  7
  • Slartibartfast  · 技术社区  · 17 年前

    让我们假设我有类似'=&?/;#+%'作为我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
    

    request.getRequestURI() , request.getRequestURL() request.getPathInfo()

    someOtherPath/=&?/;#+%/something.html?a=b&c=d#asdf
    

    我通过完全禁止上述字符解决了特定的问题,这在这种情况下是可行的,但我仍然想知道是否有任何方法可以在servlet类中获取未编码的URL。

    更奇怪! 我已经映射了servlet,比如/servletPath/*,之后我可以放置任何我想要的东西,并让我的servlet根据路径的其余部分做出响应, 当路径中有%2F时。那样的话 我得到了404!如果我用“/”代替%2F,它就可以正常工作。我在Linux上的Java 1.6.0-04上运行Tomcat 6.0.14。

    5 回复  |  直到 17 年前
        1
  •  24
  •   jcsahnwaldt Reinstate Monica    10 年前

    • getPathInfo:已解码
    • getPathTranslated:未解码

    应该 被解码。如果是这样,那么您的Servlet容器就违反了规范(正如Wouter Coekaerts和Francois Gravel正确指出的那样)。您正在运行哪个Tomcat版本?

    更令人困惑的是,当前的Tomcat版本拒绝包含某些特殊字符编码的路径, for security reasons .

        2
  •  2
  •   Powerlord    17 年前

    如果有 %2F url,它的意思是 编码的 包含url %252F .

    自从 %2F / 为什么不干脆分手呢 "\/" 不用担心URL编码?

        3
  •  1
  •   Francois Gravel    17 年前
        4
  •  0
  •   stevedbrown    17 年前

    url.substring(startLength,url.length-endLength);

        5
  •  -1
  •   Wouter Coekaerts    14 年前

    这个答案最初错误地指出路径中的“/”和“%2F”应始终被视为相同。它们实际上是不同的,因为路径是由/-分隔的段组成的列表。

    您不必在中区分编码字符和非编码字符

    • 查看路径部分的终点。因为a?路径中的编码不应被视为结束。
    • 在查询字符串内部。因为参数的部分值可能包含“&'或'=',。..
    • 在路径内,“/”分隔两个段,而“%2F”可以包含在段内

    • getPathInfo()
    • getParameter(String) 访问查询部分的各个部分

    第三个案子处理得不太好。如果你想区分两个路径段的分隔符“/”和路径段(%2F)内的“/”,那么你就不能一致地将路径表示为一个解码字符串。你可以将其表示为一种编码字符串(例如“foo/bar%2Fbaz”),也可以将其表示为解码段列表(例如“foo”、“bar/baz”)。

    对于普通的web应用程序来说,这很好。如果你在极少数情况下真的需要有所作为,你可以自己解析网址,用 getRequestURI()

    推荐文章