Как избежать JavaScript в JSP?
Я полностью застрял в этом, я пытаюсь избежать единственной цитаты в JSP. У меня есть некоторые данные, которые я выводю непосредственно в строку JS, и одинарные кавычки, кажется, вызывают проблемы.
Вот мой код:
<dsp:droplet name="/atg/dynamo/droplet/ForEach">
<dsp:param value="${CommerceItems}" name="array" />
<dsp:param name="elementName" value="CommerceItem" />
<dsp:oparam name="outputStart">
var itemNameList ='
</dsp:oparam>
<dsp:oparam name="output">
<dsp:getvalueof id="Desc" param="CommerceItem.auxiliaryData.productRef.displayName">
${fn:replace(Desc, "'", "\\/'")}
</dsp:getvalueof>
</dsp:oparam>
<dsp:oparam name="outputEnd">';</dsp:oparam>
</dsp:droplet>
И вот результат, который я получаю:
var itemNameList ='
Weyland Estate Santa Barbara Pinot Noir
Raymond \/'Prodigal\/' North Coast Cabernet Sauvignon
Chateau Haute Tuque';
Но это неправильно, а мне просто нужно /'Prodigal'/
или ни одного кавычки вообще!
РЕДАКТИРОВАТЬ: Или мне на самом деле нужно избегать цитат с \
обратный слеш?
2 ответа
Косая черта не является escape-символом. Это обратный слеш.
${fn:replace(Desc, "'", "\\'")}
(да, он был представлен дважды, потому что это также escape-символ в Java!)
Однако вам нужно не только переделывать '
от \'
Вам также необходимо заменить \n
(переводы строк) \\n
, Строка печатается в несколько строк, что также делает ее недопустимой строковой переменной JS. Ваш конечный результат должен выглядеть примерно так:
var itemNameList = ''
+ '\nWeyland Estate Santa Barbara Pinot Noir'
+ '\nRaymond \'Prodigal\' North Coast Cabernet Sauvignon'
+ '\nChateau Haute Tuque';
(обратите внимание, что подсветка синтаксиса согласна со мной здесь, но не с вашей)
Однако существует гораздо больше возможных специальных символов, которые необходимо экранировать. Все они покрыты Apache Commons Lang StringEscapeUtils#escapeEcmaScript()
, Гораздо проще создать собственную функцию EL, которая вызывает именно этот метод. Если еще не сделано, загрузите и бросьте commons-lang.jar
в /WEB-INF/lib
, Затем создайте /WEB-INF/functions.tld
файл как следует:
<?xml version="1.0" encoding="UTF-8" ?>
<taglib
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<display-name>Custom Functions</display-name>
<tlib-version>1.0</tlib-version>
<uri>http://example.com/functions</uri>
<function>
<name>escapeJS</name>
<function-class>org.apache.commons.lang3.StringEscapeUtils</function-class>
<function-signature>java.lang.String escapeEcmaScript(java.lang.String)</function-signature>
</function>
</taglib>
Так что вы можете использовать его следующим образом:
<%@taglib prefix="util" uri="http://example.com/functions" %>
...
${util:escapeJS(Desc)}
В продолжение предыдущего комментария (Как экранировать JavaScript в JSP? ): Если вы используете Spring MVC, вы можете использовать тег escapeBody в своем JSP:
<%@ taglib prefix="s" uri="http://www.springframework.org/tags" %>
...
<s:escapeBody>${text}</s:escapeBody>