如何使用 JSTL 转义 HTML 标签
How to unescape HTML tags with JSTL
我必须使用 JSTL 在页面中显示一些已经转义 HTML 标签的内容。
我知道excapeXml
用于转义可解释为标记的字符。但似乎它只适用于普通和未转义的 HTML: <p>This is the news</p>
,它不能正确地用于已经转义的 HTML: <p>This is the news</p>
.
那么,我怎样才能使用 JSTL 取消已经转义的 HTML?
为什么不考虑使用 JSP 自定义标签?通过使用自定义标签,您可以更好地控制您的标签。
http://javatips.info/jsp-custom-tag.html
对于您的情况,您可以在 post 中找到示例 2 或 4。
将您的内容作为标签的正文放入 jsp:
<%@taglib uri="http://javatips.info/simple-tag" prefix="spl"%>
<spl:splWithBody color="red" headerColor="cyan"><p>This is the news</p></spl:splWithBody>
在网络浏览器中输出:
SimpleTagSupport:正文 ->
这是新闻
JSTL 不提供专门用于非转义 HTML(也不 XML)的标签或函数。您最接近的赌注是 fn:replace()
,如下所示,假设有问题的未转义 HTML 内容是通过 ${bean.content}
.
提供的
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
${fn:replace(fn:replace(bean.content, '<','<'), '>','>')}
如果你有更多的字符需要被转义,它只会变得丑陋和乏味,而不仅仅是 <
和 >
.
您最安全的选择是引入自定义 EL 函数,该函数依次调用 Apache Commons Lang StringEscapeUtils#unescapeXml()
or perhaps unescapeHtml4()
method. If not done yet, download 并在 /WEB-INF/lib
中删除 commons-lang.jar
。然后创建一个 /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>
<short-name>f</short-name>
<uri>http://example.com/functions</uri>
<function>
<name>unescapeXml</name>
<function-class>org.apache.commons.lang3.StringEscapeUtils</function-class>
<function-signature>java.lang.String unescapeXml(java.lang.String)</function-signature>
</function>
</taglib>
最后只用如下:
<%@taglib prefix="f" uri="http://example.com/functions" %>
...
${f:escapeXml(bean.content)}
与具体问题无关,我个人会退一步。为什么你首先逃脱了HTML?这很奇怪。通常,转义应该只在 HTML-rendering 期间发生。我宁愿查找负责转义 HTML 的人,然后将其更改为不再不必要地转义 HTML 。也许对此负责的人并没有真正理解围绕 HTML 的概念——在网页中转义,并在请求处理期间手动执行转义,作为一种不周到的 XSS 预防尝试的一部分。这是阅读的食物:XSS prevention in JSP/Servlet web application.
我必须使用 JSTL 在页面中显示一些已经转义 HTML 标签的内容。
我知道excapeXml
用于转义可解释为标记的字符。但似乎它只适用于普通和未转义的 HTML: <p>This is the news</p>
,它不能正确地用于已经转义的 HTML: <p>This is the news</p>
.
那么,我怎样才能使用 JSTL 取消已经转义的 HTML?
为什么不考虑使用 JSP 自定义标签?通过使用自定义标签,您可以更好地控制您的标签。
http://javatips.info/jsp-custom-tag.html
对于您的情况,您可以在 post 中找到示例 2 或 4。
将您的内容作为标签的正文放入 jsp:
<%@taglib uri="http://javatips.info/simple-tag" prefix="spl"%>
<spl:splWithBody color="red" headerColor="cyan"><p>This is the news</p></spl:splWithBody>
在网络浏览器中输出:
SimpleTagSupport:正文 ->
这是新闻
JSTL 不提供专门用于非转义 HTML(也不 XML)的标签或函数。您最接近的赌注是 fn:replace()
,如下所示,假设有问题的未转义 HTML 内容是通过 ${bean.content}
.
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
${fn:replace(fn:replace(bean.content, '<','<'), '>','>')}
如果你有更多的字符需要被转义,它只会变得丑陋和乏味,而不仅仅是 <
和 >
.
您最安全的选择是引入自定义 EL 函数,该函数依次调用 Apache Commons Lang StringEscapeUtils#unescapeXml()
or perhaps unescapeHtml4()
method. If not done yet, download 并在 /WEB-INF/lib
中删除 commons-lang.jar
。然后创建一个 /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>
<short-name>f</short-name>
<uri>http://example.com/functions</uri>
<function>
<name>unescapeXml</name>
<function-class>org.apache.commons.lang3.StringEscapeUtils</function-class>
<function-signature>java.lang.String unescapeXml(java.lang.String)</function-signature>
</function>
</taglib>
最后只用如下:
<%@taglib prefix="f" uri="http://example.com/functions" %>
...
${f:escapeXml(bean.content)}
与具体问题无关,我个人会退一步。为什么你首先逃脱了HTML?这很奇怪。通常,转义应该只在 HTML-rendering 期间发生。我宁愿查找负责转义 HTML 的人,然后将其更改为不再不必要地转义 HTML 。也许对此负责的人并没有真正理解围绕 HTML 的概念——在网页中转义,并在请求处理期间手动执行转义,作为一种不周到的 XSS 预防尝试的一部分。这是阅读的食物:XSS prevention in JSP/Servlet web application.