Java -> Apache Commons StringEscapeUtils -> escapeJavaScript

Для очень простого поиска имени ajax я отправляю идентификатор с веб-страницы клиента на сервер (Tomcat 5.5, Java 5), ​​ищу его в базе данных и возвращаю строку, которая присваивается переменной javascript обратно в клиент (а затем отображается).

Код javascript, который получает значение, довольно стандартный:

//client code - javascript
xmlHttp.onreadystatechange=function() {
    if (xmlHttp.readyState==4) {
        var result = xmlHttp.responseText;
        alert(result);
        ...
    }
    ...
}

Чтобы вернуть строку, у меня изначально было это на сервере:

//server code - java
myString = "...";
out.write(myString.getBytes("UTF-8"));

Который работал отлично, хотя и небезопасно. Позже заменил на:

import org.apache.commons.lang.StringEscapeUtils;
...
myString = "...";
out.write(StringEscapeUtils.escapeJavaScript(myString).getBytes("UTF-8"));

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

Например, используя:

escapeJavaScript("años").getBytes("UTF-8");

отправляет:

an\u00F1os

клиенту.

Вопрос: есть ли простой способ проанализировать полученную строку в Javascript или есть альтернативная функция escape, которую я могу использовать в java, которая предотвратила бы эту проблему?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
7 465
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Следующее работает во всех браузерах, которые я пробовал:

javascript:alert("a\u00F1os");

Возможно, ваша строка дважды экранируется по ошибке.

Да, я думаю, что в этом конкретном случае побег не нужен (см. Другой мой комментарий ниже)

Jarrod Dixon 31.10.2008 00:49

На самом деле, теперь, когда я его перечитал, я думаю, что на самом деле не нужно вообще избежать строки, которую я отправляю обратно ... То есть StringEscapeUtils.escapeJavaScript был бы полезен, если бы полученное значение было напечатано на странице, например:

//javascript code with inline struts
var myJavasriptString = "<%=myJavaString%>";

Или я что-то упустил, и в исходном случае все еще есть веская причина для побега? (когда он возвращается в виде серии байтов обратно в обработчик ajax onreadystatechange и назначается переменной js)

Другие вопросы по теме