Java -> Apache Commons StringEscapeUtils -> escapeJavaScript - PullRequest
2 голосов
/ 31 октября 2008

Для очень простого поиска имени 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, чтобы предотвратить эту проблему?

Ответы [ 2 ]

1 голос
/ 31 октября 2008

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

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

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

1 голос
/ 31 октября 2008

В каждом браузере, который я пробовал, работает следующее:

javascript:alert("a\u00F1os");

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

...