2016-01-06 2 views
1

В настоящее время включает URLEncoder и URLDecoder в некоторый код. Уже сохранено множество URL-адресов, которые будут обрабатываться с помощью процедуры URLDecoder, которая не была первоначально обработана с помощью процедуры URLEncoder.Любые проблемы с выполнением URLDecoder в отношении URL-адреса, который не был закодирован?

Основываясь на некоторых тестах, он не появляется, будет проблема, но при условии, что я не протестировал все сценарии.

Я заметил, что некоторые символы, такие как «/», которые обычно кодируются, обрабатываются только с помощью процедуры декодирования, даже если они не были первоначально закодированы.

Это привело меня к упрощенному анализу. Похоже, что процедура URLDecoder по существу проверяет URL-адрес для «&» и следующих 2 байтов (при использовании UTF-8). Пока не существует «&» в ранее сохраненных URL-адресах, тогда не должно быть проблем при обработке с помощью процедуры URLDecoder. Звучит ли это правильно?

+0

Я предполагаю, что вы имеете в виду «%» вместо «&», правильно? :) –

+0

Да, я сделал. Oooops. –

ответ

2

Да, хотя он будет работать для «простых» случаев, вы можете столкнуться с a) исключениями или b) неожиданным поведением при вызове URLDecoder.decode для некодированного URL, который содержит определенные специальные символы.

Рассмотрим следующий пример: Он будет бросать java.lang.IllegalArgumentException: URLDecoder: Incomplete trailing escape (%) pattern для третьего испытания, и он будет изменять URL без исключения для второго испытания (в то время как регулярное кодирование/декодирование работает без проблем):

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) 

Смотрите javadoc of URLDecoder для двух случаев, а также:

  • Знак плюса «+» преобразуется в символ пробела «».
  • Последовательность формы «% xy» будет рассматриваться как представляющая собой байт, где xy представляет собой двухзначное шестнадцатеричное представление 8 бит. Затем все подстроки, которые содержат одну или несколько из этих последовательностей байтов , последовательно будут заменены символом (символами), чья кодировка приведет к этим последовательным байтам. Схема кодирования, используемая для декодирования этих символов , может быть указана или если не указано, будет использоваться кодировка по умолчанию по умолчанию.

Если вы уверены, что ваши Unencoded URL-адрес не содержат + или %, то я бы сказал, что это безопасно для вызова URLDecoder.decode. В противном случае я бы посоветовал выполнить дополнительные проверки, например. попробуйте декодировать и сравнить с оригиналом (см. this question on SO).

Смежные вопросы