Как избежать двойных кавычек в функции JSTL? - PullRequest
18 голосов
/ 18 августа 2011

Мне нужно изменить " на \" с 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" ... "<" ... "лт" ... "> =" ... "гэ" ... "<=" ... "ле" ... "==" ... "экв" ... знак равно "нэ" ... "&&" ... "а также" ... "||" ... "или же" ... "*" ... "+" ... "-" ... "/" ... "Div" ... "%" ... "мод" ... </p>

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

Обновление

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

<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;')}">

Ответы [ 3 ]

22 голосов
/ 18 августа 2011

Это не работает, потому что \ является 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)}">

Смотри также:

5 голосов
/ 29 января 2014

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

Правильный путь:

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

Редактировать: Побольше размышлений:

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

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

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

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

...