Как избежать двойных кавычек в функции 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, '"', '"')}">
Ответы
Ответ 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
не будет изменен этим вызовом.