Java从Servlet读取未编码的URL
让我们假设我有像“=&?/;#+%”这样的字符串要成为我的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&
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”可以包含在一个段中
它只返回解码的路径部分getPathInfo()
访问查询部分的部分getParameter(String)
对于通常的web应用程序,这是很好的。如果您确实需要做出改变,那么您可以自己解析URL,使用
getRequestURI()
获取原始版本。如果该URL按照您的说法进行了解码,那么这意味着您正在使用的servlet实现中存在错误。浏览器和服务器的“%2F”和“/”之间存在根本性差异
HttpServletRequest规范说明(无任何逻辑,AFAICT):
- getContextPath:未解码
- getPathInfo:已解码
- getPathTranslated:未解码
- getQueryString:未解码
- getRequestURI:未解码
- getServletPath:已解码
更令人困惑的是,当前的Tomcat版本拒绝包含某些特殊字符编码的路径。如果字符串已经解码,为什么会有%2f?返回值是什么样子的?您希望它是什么?这是否相关?我真的不知道问题出在哪里。听起来像是试图解码一个非法且格式错误的URL。像这样在规范之外运行可能会导致一系列问题。您可以控制更改数据传递的方式吗?e、 g.是否移动到发布数据?对于任何在将来某个日期遇到此问题的人,%2F的问题是由于一个。不,我有param1/param2/param3,它们的长度都未知。你部分是对的。当我有一些UTF-8字符时,它会保持未编码状态,但特殊字符不会。我正在研究Tomcat。所以,我认为/和%2F之间存在差异,而标准上没有差异,这是我的错。正如我所说的,我跳过了这个问题,在字符到达url编码部分之前消除了字符,我想这是唯一的st