Как избежать двойных кавычек в функции JSTL?

Мне нужно изменить " на \" с помощью JSTL заменить функцию, чтобы использовать строку в теге ввода, например:

<input type="hidden" name="text" size="40" value="${text}">

Если ${text} имеет ", HTML будет разбит.

Итак, я попробовал

<input type="hidden" name="text" size="40" value="${fn:replace(text, "\"", "\\\""}">

и

<input type="hidden" name="text" size="40" value="${fn:replace(text, '"', '\"'}">

но не сработал. Страница содержит ошибки, такие как

org.apache.el.parser.ParseException: встречается "}" "}" "на линии 1, столбец 32. Ожидалось:     " "...     " ) "...     " [ "...     " , "...     " > "...     " gt "...     " & Л; "...     " lt "...     " >= "...     " ge "...     " <= "...     " ле "...     " == "...     " eq "...     знак равно     " ne "...     " & & "...     " а также "...     " || "...     " или "...     " * "...     " + "...     " - "...     " / "...     " div "...     " % "...     " mod"...

Как я могу это сделать?

Обновление

Я пропустил близкий ответ на функцию замены. Правильный был тот, у кого был близкий паз:

<input type="hidden" name="text" size="40" value="${fn:replace(text, '"', '\"')}">

Update2

Я узнал, что при публикации текстов использование \ не является хорошей идеей по этой причине почему нельзя использовать \" в теге ввода HTML?. Код должен выглядеть следующим образом:

<input type="hidden" name="text" size="40" value="${fn:replace(text, '"', '&quot;')}">

Ответы

Ответ 1

Это не работает, потому что \ является escape-символом в строке Java. Чтобы представить его буквально, вам нужно снова сбежать от него с помощью другого \. Кроме того, " является специальным символом в EL, вам также необходимо избегать его, чтобы представлять его буквально. Таким образом, правильный синтаксис был бы следующим:

<input type="hidden" name="text" size="40" value="${fn:replace(text, '\"', '\\\"'}">

Но вы должны использовать fn:escapeXml() для предотвращения XSS. Это не только ускользает от кавычек, но и других символов.

<input type="hidden" name="text" size="40" value="${fn:escapeXml(text)}">

См. также:

Ответ 2

Вы делаете это неправильно (с помощью fn: replace).

Правильный способ:

<input type="hidden" name="text" size="40" value="<c:out value='${text}'/>">
(actually tested code - works 100%)

Изменить: Поразмыслив:

  • способ использования fn: escapeXml (как написано BalusC) тоже работает и выглядит лучше (без вложенных тегов)
  • используя fn: replace to mimick fn: escapeXml запрашивает проблемы. Вы запустите, забудьте указать некоторый символ, который должен быть экранирован. Просто используйте существующие, проверенные и проверенные fn: escapeXml (или c: out)

Ответ 3

У вас может быть опечатка: я не вижу закрывающего пара. Попробуйте следующее:

${fn:replace(news.title, "\"", "\\\"")}

Кроме того, пытаетесь ли вы вывести результаты или пытаетесь обновить news.title, чтобы при следующем доступе к news.title замена была на месте? Это будет работать для вывода результата, но не для замены фактического значения: news.title не будет изменен этим вызовом.