Если я добавляю комментарий как "привет там собака", она работает отлично, но если существуют какие-либо специальные символы как, 'или "комментарий добавляется успешно к базе данных, но код jQuery не отображает комментарий в списке.
Спасибо за любые подсказки.
function feedbacksubmit () {
// Show the Ajax Loader
$("#ajaxloader").css("display","inline");
var textsubmitted = $("#feedbackinput").val();
if (textsubmitted.length < 5) {
alert("Don't forget to write something!");
// Hide the Ajax Loader
$("#ajaxloader").css("display","none");
}
else {
$.post("/feedback/ajax/insert/", {feedback: textsubmitted},
function(data) {
// Place the comment in the top of the list
$('<li></li>').prependTo("#comment-list").hide().prepend(data.commenttext2insert).fadeIn('slow');
// Hide the Ajax Loader
$("#ajaxloader").css("display","none");
// Clear out the textarea
$("#feedbackinput").val('');
}, "json");
}
}
Вот ответ в качестве примера, который не работает с кодом jQuery выше:
{"returnmessage":"The Ajax operation was successful.","returncode":"0","commenttext2insert":"\n\t<div class=\"comment-header\">\n\t\t<span class=\"comment-avatar\">\n\t\t\t<a href=\"\">\n\t\t\t\t\n\t\t\t\t\t<img src=\"/_images/users/photos//17941/nobosh.jpg\" />\t\t\t\t\t\t\t\n\t\t\t\t\n\t\t\t</a>\n\t\t</span>\n\t\t<span class=\"comment-author\">\n\t\t\t<a href=\"\">\n\t\t\t\t<b>BOB Man</b>\n\t\t\t</a>\n\t\t</span>\n\t\t<span class=\"comment-timestamp\">just now</span>\n\t</div>\n\t<div class=\"comment-body\">\n\t\t<p>12wsa\'</p>\n\t</div>\n"}
Как выглядит ваш ColdFusion (по крайней мере, та часть, где вы возвращаете что-то браузеру)? Если BalusC прав насчет необходимости экранирования символов html в возвращаемых данных, вы можете просто обернуть свой текст функцией HTMLEditFormat, а не писать что-либо на Java.
Попробуйте что-нибудь вроде:
$.post("/feedback/ajax/insert/", {feedback: escape(textsubmitted)},
...
Если вы готовите HTML на стороне сервера, вам необходимо убедиться, что все зарезервированные символы HTML в управляемом пользователем вводе правильно экранированы, иначе это может привести к тому, что JS-код станет синтаксически некорректным (и сделает ваш сайт уязвимым для XSS). Вам необходимо экранировать как минимум зарезервированные HTML-символы <
, >
, &
, "
и '
в HTML-символы <
, >
, &
, "
и '
соответственно.
Вы упомянули, что используете Coldfusion, который основан на Java. Поскольку стандартный Java SE/EE API не предоставляет встроенных средств для экранирования, вам придется либо написать их самостоятельно, например,
public static final String escapeHTML(String string){
StringBuilder builder = new StringBuilder();
for (char c : string.toCharArray()) {
switch (c) {
case '<': builder.append("<"); break;
case '>': builder.append(">"); break;
case '&': builder.append("&"); break;
case '"': builder.append("""); break;
case '\'': builder.append("'"); break;
default: builder.append(c); break;
}
}
return builder.toString();
}
...который можно использовать как
input = escapeHTML(input);
...либо взять, например, Apache Commons Lang StringEscapeUtils#escapeHtml4
который можно использовать как
input = StringEscapeUtils.escapeHtml4(input);
Опять же, делайте это только для ввода, управляемого пользователем. Вам не нужно делать это для любого HTML кода, который вы жестко закодировали в коде на стороне сервера (иначе он будет отображаться как есть). Таким образом, сделайте что-то вроде:
StringBuilder comment = new StringBuilder();
comment.append("<div class=\"comment\">");
comment.append(escapeHTML(input));
comment.append("</div>");
Тем не менее, я уже прокомментировал ваш вопрос, намекнув, что вам лучше сделать это в jQuery, потому что это, в конце концов, гораздо лучше с точки зрения сопровождаемости и возможности повторного использования. Вы же не хотите иметь сырой HTML, спрятанный где-то в глубинах Java-кода. Вы также не хотите, чтобы результат JSON зависел от цели. Просто верните общий (и санированный HTML) результат JSON и позвольте jQuery создать HTML.