Вопрос

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

Это было полезно?

Решение

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

javascript:alert("a\u00F1os");

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top