Декодирование параметра URL не работает

В моем веб-приложении Java мне нужно создать URL-адрес, а затем вызвать URL-адрес. При создании URL-адреса я кодирую значение параметра с помощью URLEncoder.encode("text","UTF-8") Но когда мы получаем параметр на принимающей стороне и декодируем его - он не декодируется должным образом. Я попытался установить закодированное значение в качестве атрибута запроса, это работает нормально. Но не может использовать его по запросу клиента.

Написал следующий код для тестирования URLEncoder и URLDecoder и URLCodec из функций кодека Apache commons.

    StringBuffer sb = new StringBuffer("TestSpecialChar'` ~6 Æ æ  Ç  È  123");
    //String testCharacters = "TestSpecialChar'` ~6 Æ æ  Ç  È  123";
    String testCharacters = sb.toString();
    try {
        String encoded = URLEncoder.encode(testCharacters, "UTF-8");
        System.out.println("URLEncoder : " + encoded);
        System.out.println("URLDecoder : " + URLDecoder.decode(encoded, "UTF-8"));
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    URLCodec urlc = new URLCodec("UTF-8");
    try {
        String encoded = urlc.encode(testCharacters);
        System.out.println("urlc.encode : " + encoded);
        System.out.println("urlc.decode : " + urlc.decode(encoded));            
    } catch (EncoderException ee){
        ee.printStackTrace();
    } catch (DecoderException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        String encoded = urlc.encode(testCharacters);
        System.out.println("urlc.encode : " + encoded);
        System.out.println("URLDecoder : " + URLDecoder.decode(encoded, "UTF-8"));
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (EncoderException ee){
        ee.printStackTrace();
    }

Этот код работает отлично. Затем я написал простое веб-приложение, в котором у меня есть две страницы JSP, в которых одна вызывает другую с закодированным значением в URL-адресе. Это не показывает правильное декодированное значение на стороне приемника. Вот код для справки.

sender.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page language="java" import="java.net.URLEncoder"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Sender</title>
<script type="text/javascript">
function send(){
window.location='<%=request.getContextPath()%>/jsp/receiver.jsp?txt=<%=URLEncoder.encode("TestSpecialChar'` ~6 Æ æ  Ç  È  123","UTF-8")%>';
}
</script>
</head>
<body onload="javascript:send();">

</body>
</html>

receiver.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page language="java" import="java.net.URLDecoder"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Receiver</title>
</head>
<body>
<% 
if (request.getAttribute("encoded") != null){
 URLDecoder.decode(request.getAttribute("encoded").toString(),"UTF-8"); 
}
if (request.getParameter("txt") != null){
%>
<%=URLDecoder.decode(request.getParameter("txt").toString(),"UTF-8")%>
inside if getparameter
<%
}
%>
</body>
</html>

Я получаю следующий вывод в браузере

TestSpecialChar'` ~6 Æ æ Ç È 123 внутри if getparameter

вместо

TestSpecialChar'` ~6 Æ æ Ç È 123 внутри, если получить параметр

Может кто-нибудь, пожалуйста, дайте мне знать, что не так в тестовом коде и в чем разница между атрибутом запроса и параметром, из-за которого атрибут декодируется правильно, а параметр - нет?

Temp solution: Решил это, выполнив следующие действия: 1) Создал класс, который заменил бы некоторые определенные символы кодом UTF 8. 2) Удалена передача символьных данных в качестве параметров URL. 3) Убедитесь, что вызов внешнего URL-адреса имеет кодировку UTF-8. 4) Любое значение, полученное с внешнего URL-адреса или декодированное в приложении перед использованием значения.

Correct solution: Чтобы решить эту проблему, приложение должно быть разработано и закодировано с учетом i18n и всех страниц JSP с кодировкой UTF-8.


person Natraj    schedule 20.05.2013    source источник
comment
Параметры запроса должны автоматически декодироваться контейнером сервлета. Вам не нужно использовать URLDecoder самостоятельно.   -  person user207421    schedule 31.12.2016


Ответы (1)


Ваш URL кодирует текст как UTF-8, но ваши страницы JSP имеют эти объявления в них:

<%@ page language="java" 
    contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
...
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

Это может мешать вашей кодировке, если сервер обрабатывает страницу как ISO-8859-1 вместо UTF-8. Измените pageEncoding на UTF-8 и посмотрите, решит ли это вашу проблему.

person Bogdan    schedule 20.05.2013
comment
Я изменил кодировку на UTF-8 как в sender.jsp, так и в Receiver.jsp, но все равно не показывает правильный декодированный текст. Я вижу следующий URL: http://localhost:8081/AskSam/jsp/receiver.jsp?txt=TestSpecialChar%27%60+~6+%EF%BF%BD+%EF%BF%BD++%EF%BF%BD++%EF%BF%BD++123 И вывод как TestSpecialChar' ~6 � � � � 123 внутри, если getparameter ` - person Natraj; 21.05.2013