如何在JSTL函数中转义双引号?

San*_*Lee 18 java jstl el

我需要改变",以\"JSTL替换功能使用的字符串输入标签,如:

<input type="hidden" name="text" size="40" value="${text}">
Run Code Online (Sandbox Code Playgroud)

如果${text}",则HTML将被破坏.

所以我试过了

<input type="hidden" name="text" size="40" value="${fn:replace(text, "\"", "\\\""}">
Run Code Online (Sandbox Code Playgroud)

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

但没有奏效.该页面会出错

org.apache.el.parser.ParseException:遇到""}""}""在第1行第32列.期待其中一个:"." ...")"......"["...","...">"..."gt"..."<"..."lt"..."> =". .."ge"......"<="......"le"......"=="......"eq"......"!="......"ne"......"&&" ......"和"......"||" ..."或"......"*"......"+"......" - "..."/"..."div"..."%"..."mod".. .

我怎样才能做到这一点?

更新

我错过了替换功能的密切关注.正确的是这个与亲密的人:

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

UPDATE2

我发现在发布文本时,使用\不是一个好主意,因为这个原因为什么不能在HTML输入标签中使用?.代码应该是这样的:

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

Bal*_*usC 22

它不起作用,因为它\是Java字符串中的转义字符.要按字面意思来表示,你需要\再次与另一个人一起逃避它.这"也是EL中的一个特殊字符,你还需要将它转义为字面表示它.所以,正确的语法应该是:

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

但是,您实际上应该使用它fn:escapeXml()来阻止XSS.它不仅逃避了引号,还逃避了其他角色.

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

也可以看看:


Dav*_*žic 5

你做错了(使用fn:replace).

正确的方法是:

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

编辑:更多思考:

  • 通过使用fn:escapeXml(由BalusC编写)的方式也可以工作并且看起来更好(没有嵌套标签)
  • 使用fn:替换为mimick fn:escapeXml要求麻烦.您忘记包含一些应该转义的字符.只需使用现有的,经过试验和测试的fn:escapeXml(或c:out)