Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java从Servlet读取未编码的URL_Java_Url_Servlets_Encode_Decode - Fatal编程技术网

Java从Servlet读取未编码的URL

Java从Servlet读取未编码的URL,java,url,servlets,encode,decode,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&

让我们假设我有像“=&?/;#+%”这样的字符串要成为我的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。

如果解码url中有
%2F
,则表示包含
%252F
的编码url


既然
%2F
/
为什么不在
“\/”
上拆分,而不用担心URL编码?

看起来您正在尝试做一些RESTy(使用Jersey)的事情。你能不能只解析URL的前导部分和尾随部分来获取你正在寻找的数据

子字符串(startLength,url.length-endLength)

根据,getRequestURI不应解码字符串。另一方面,getServletPath返回解码的字符串。我使用Jetty在本地对其进行了测试,其性能如文档中所述


因此,由于您描述的行为与Sun文档不匹配,在您的情况下可能还有其他因素在起作用。

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

您不必在URL的路径部分
中区分编码字符和未编码字符。路径中没有可以在URL中具有特殊含义的字符。例如,“%2F”必须解释为“/”,并且访问此类URL的浏览器可以在其认为合适的情况下自由替换其中一个URL。它们之间的区别打破了URL编码的标准

在完整的URL中,您必须出于不同的原因区分转义字符和非转义字符,包括:

  • 查看路径部分的结束位置。因为一个?路径中的编码不应视为结束
  • 在查询字符串内部。因为参数的部分值可能包含“&”或“=”
  • 在路径中,“/”分隔两个段,而“%2F”可以包含在一个段中
Java可以很好地处理前两种情况:

  • getPathInfo()
    它只返回解码的路径部分
  • getParameter(String)
    访问查询部分的部分
第三个案子处理得不太好。如果要将“/”与路径段(%2F)内的“/”区别开来,则无法将路径一致地表示为一个解码字符串。您可以将其表示为一个编码字符串(例如“foo/bar%2Fbaz”),也可以表示为解码段列表(例如“foo”、“bar/baz”)。 但由于getPathInfo()API承诺只做这一点(一个解码字符串),因此它别无选择,只能将“/”和“%2F”视为相同的


对于通常的web应用程序,这是很好的。如果您确实需要做出改变,那么您可以自己解析URL,使用
getRequestURI()
获取原始版本。如果该URL按照您的说法进行了解码,那么这意味着您正在使用的servlet实现中存在错误。

浏览器和服务器的“%2F”和“/”之间存在根本性差异

HttpServletRequest规范说明(无任何逻辑,AFAICT):

  • getContextPath:未解码
  • getPathInfo:已解码
  • getPathTranslated:未解码
  • getQueryString:未解码
  • getRequestURI:未解码
  • getServletPath:已解码
getPathInfo()的结果应解码,但getRequestURI()的结果不得解码。如果是,您的Servlet容器就违反了规范(正如Wouter Coekaerts和Francois Grasser正确指出的那样)。您正在运行哪个Tomcat版本


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

如果字符串已经解码,为什么会有%2f?返回值是什么样子的?您希望它是什么?这是否相关?我真的不知道问题出在哪里。听起来像是试图解码一个非法且格式错误的URL。像这样在规范之外运行可能会导致一系列问题。您可以控制更改数据传递的方式吗?e、 g.是否移动到发布数据?对于任何在将来某个日期遇到此问题的人,%2F的问题是由于一个。不,我有param1/param2/param3,它们的长度都未知。你部分是对的。当我有一些UTF-8字符时,它会保持未编码状态,但特殊字符不会。我正在研究Tomcat。所以,我认为/和%2F之间存在差异,而标准上没有差异,这是我的错。正如我所说的,我跳过了这个问题,在字符到达url编码部分之前消除了字符,我想这是唯一的st