输出JSTL逃脱了吗?

UpH*_*lix 10 javascript java jstl escaping

我正在使用JSTL从我们的数据库中检索一个值.我正在将其插入到一些javascript中以将其用作变量.我需要转义JSTL所持有的值的输出,因为如果有单引号或双引号则会破坏我的脚本.该值是用户指定的.

例:

执行以下操作:

<c:set var="myVar" value="Dale's Truck"/>

<script type="text/javascript">
    var mayVar = '${myVar}';
</script>
Run Code Online (Sandbox Code Playgroud)

实际上最终看起来像:

<script type="text/javascript">
    var mayVar = 'Dale's Truck';//extra single quote breaks the JS
</script>
Run Code Online (Sandbox Code Playgroud)

因此,我需要将JSTL var转换为像"Dale%27s Truck"之类的转义才能进入JS,因为它已经太晚了,因为它已经太晚了,当它到达我的JS能够在JS中完成它.

Viv*_*ath 12

尝试使用fn:replace:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

<c:set var="myVar" value="Dale's Truck" />
<c:set var="search" value="'" />
<c:set var="replace" value="%27" />

<c:set var="myVar" value="${fn:replace(myVar, search, replace)}"/>
Run Code Online (Sandbox Code Playgroud)

或者你可以用反斜杠来逃避单引号:

<c:set var="replace" value="\\'" />
Run Code Online (Sandbox Code Playgroud)

或者如果你甚至不想做所有这些并且你确定该字符串不包含双引号,为什么不这样做:

var myVar = "${myVar}"; //string enclosed with double quotes instead of single quotes
Run Code Online (Sandbox Code Playgroud)

但是如果字符串有双引号,你仍然需要转义它们:

<c:set var="search" value="\"" />
<c:set var="replace" value="\\\"" />
Run Code Online (Sandbox Code Playgroud)

  • 永远不要写自己的逃避功能!因为它会错.例如,输入"ab \\'c"的双反斜杠示例失败.它将被转换为\\',因此反斜杠会被转义,单引号将结束字符串.使用经过验证和调试的现有函数,例如var x ='<spring:escapeBody htmlEscape ="false"javaScriptEscape ="true"> $ {myVar} </ spring:escapeBody>'; (4认同)