JSP 如何使用JSTL取消转义HTML标签

prdp8dxp  于 2024-01-04  发布在  其他
关注(0)|答案(3)|浏览(243)

我必须显示一些内容与已经逃脱的HTML标记在页面与JSTL。
我知道excapeXml是用于转义可以被解释为标记的字符的。但似乎它只对普通和未转义的HTML:<p>This is the news</p>起作用,它对已经转义的HTML:&lt;p&gt;This is the news&lt;/p&gt;不起作用。
那么,如何用JSTL来恢复已经转义的HTML呢?

pdtvr36n

pdtvr36n1#

JSTL不提供专门针对非转义HTML(也不提供XML)的标记或函数。您最接近的选择是fn:replace(),如下所示,假设所讨论的非转义HTML内容是通过${bean.content}提供的。

  1. <%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
  2. ...
  3. ${fn:replace(fn:replace(bean.content, '&lt;','<'), '&gt;','>')}

字符串
如果你有更多的字符需要解转义,而不仅仅是<>,它只会变得丑陋和乏味。
最安全的方法是引入一个自定义EL函数,该函数依次调用Apache Commons LangStringEscapeUtils#unescapeXml()unescapeHtml4()方法。如果还没有完成,请将downloadcommons-lang.jar放入/WEB-INF/lib中。然后创建一个/WEB-INF/functions.tld文件,如下所示:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <taglib
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
  6. version="2.1">
  7. <display-name>Custom Functions</display-name>
  8. <tlib-version>1.0</tlib-version>
  9. <short-name>f</short-name>
  10. <uri>http://example.com/functions</uri>
  11. <function>
  12. <name>unescapeXml</name>
  13. <function-class>org.apache.commons.lang3.StringEscapeUtils</function-class>
  14. <function-signature>java.lang.String unescapeXml(java.lang.String)</function-signature>
  15. </function>
  16. </taglib>


最后,就像下面这样使用它:

  1. <%@taglib prefix="f" uri="http://example.com/functions" %>
  2. ...
  3. ${f:escapeXml(bean.content)}

无关具体的问题,我个人会退后一步。你到底为什么要逃避HTML摆在首位?很奇怪。通常,转义应该发生在HTML中-我宁愿查找负责转义HTML的人,然后更改它,使其不再不必要地转义HTML。也许负责的人并没有真正理解网页中HTML转义的概念,以及在请求处理过程中手动执行转义,这是一个轻率的XSS预防尝试的一部分。

展开查看全部
mklgxw1f

mklgxw1f2#

为什么不考虑使用JSP自定义标记呢?通过使用自定义标记,您可以对标记进行更多的控制。
http://javatips.info/jsp-custom-tag.html
对于您的情况,您可以在文章中找到示例2或4。
把你的内容作为你的jsp中标记的主体:

  1. <%@taglib uri="http://javatips.info/simple-tag" prefix="spl"%>
  2. <spl:splWithBody color="red" headerColor="cyan">&lt;p&gt;This is the news&lt;/p&gt;</spl:splWithBody>

字符串

浏览器输出:

SimpleTagSupport:with body ->这是新闻

mzillmmw

mzillmmw3#

使用下面的代码:

  1. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  2. ...
  3. <c:out value="${yourEscapedHTML}" escapeXml="false" />
  4. ...

字符串

相关问题