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 对未编码的URL执行URLDecoder有什么问题吗?_Java_Urlencode_Urldecode - Fatal编程技术网

Java 对未编码的URL执行URLDecoder有什么问题吗?

Java 对未编码的URL执行URLDecoder有什么问题吗?,java,urlencode,urldecode,Java,Urlencode,Urldecode,目前正在将URL编码器和URL解码器合并到一些代码中。 已经保存了许多URL,这些URL将由URLDecoder例程处理,而URLEncoder例程最初没有处理这些URL 根据一些测试,似乎不会出现问题,但我没有测试所有的场景 我确实注意到一些字符,如/,通常会被编码,即使最初没有编码,也会被解码例程处理 这导致我的分析过于简单。似乎URLDecover例程基本上检查URL中的%和接下来的2个字节(如果使用UTF-8)。只要在先前保存的URL中没有任何%,那么在由URLDecover例程处理时就

目前正在将URL编码器和URL解码器合并到一些代码中。 已经保存了许多URL,这些URL将由URLDecoder例程处理,而URLEncoder例程最初没有处理这些URL

根据一些测试,似乎不会出现问题,但我没有测试所有的场景

我确实注意到一些字符,如
/
,通常会被编码,即使最初没有编码,也会被解码例程处理


这导致我的分析过于简单。似乎URLDecover例程基本上检查URL中的
%
和接下来的2个字节(如果使用UTF-8)。只要在先前保存的URL中没有任何
%
,那么在由URLDecover例程处理时就不会出现问题。这听起来正确吗?

是的,虽然它适用于“简单”的情况,但如果调用
urldecker.decode对包含某些特殊字符的未编码URL进行解码,您可能会遇到a)异常或b)意外行为

考虑以下示例:对于第三个测试,它将抛出
java.lang.IllegalArgumentException:urldecker:complete trailing escape(%)模式,对于第二个测试,它将毫无例外地更改URL(而常规编码/解码工作时不会出现问题):

输出(注意
+
符号是如何消失的):

有关这两种情况,请参见:

  • 加号“+”转换为空格字符“”
  • 形式为“%xy”的序列将被视为表示字节,其中xy是8位的两位十六进制表示形式。 然后,所有包含一个或多个字节序列的子字符串 将连续替换为其编码的字符 将导致这些连续字节。用于 可以指定对这些字符进行解码,如果未指定,则使用 将使用平台的默认编码

如果您确定您的未编码URL不包含
+
%
,那么我会说调用
urldecker.decode是安全的。否则,我建议执行额外的检查,例如尝试解码并与原始文件进行比较(参见)。

我猜您的意思是“%”而不是“&”,对吗?:)是的,我有。哎呀。
import java.net.URLDecoder;
import java.net.URLEncoder;

public class Test {
    public static void main(String[] args) throws Exception {
        test("http://www.foo.bar/");
        test("http://www.foo.bar/?q=a+b");
        test("http://www.foo.bar/?q=äöüß%"); // Will throw exception
    }

    private static void test(String url) throws Exception {
        String encoded = URLEncoder.encode(url, "UTF-8");
        String decoded = URLDecoder.decode(encoded, "UTF-8");
        System.out.println("encoded: " + encoded);
        System.out.println("decoded: " + decoded);
        System.out.println(URLDecoder.decode(decoded, "UTF-8"));
    }
}
encoded: http%3A%2F%2Fwww.foo.bar%2F
decoded: http://www.foo.bar/
http://www.foo.bar/
encoded: http%3A%2F%2Fwww.foo.bar%2F%3Fq%3Da%2Bb
decoded: http://www.foo.bar/?q=a+b
http://www.foo.bar/?q=a b
encoded: http%3A%2F%2Fwww.foo.bar%2F%3Fq%3D%C3%A4%C3%B6%C3%BC%C3%9F%25
decoded: http://www.foo.bar/?q=äöüß%
Exception in thread "main" java.lang.IllegalArgumentException: URLDecoder: Incomplete trailing escape (%) pattern
    at java.net.URLDecoder.decode(Unknown Source)
    at Test.test(Test.java:16)