我必须显示一些内容与已经逃脱的HTML标记在页面与JSTL。我知道excapeXml是用于转义可以被解释为标记的字符的。但似乎它只对普通和未转义的HTML:<p>This is the news</p>起作用,它对已经转义的HTML:<p>This is the news</p>不起作用。那么,如何用JSTL来恢复已经转义的HTML呢?
excapeXml
<p>This is the news</p>
<p>This is the news</p>
pdtvr36n1#
JSTL不提供专门针对非转义HTML(也不提供XML)的标记或函数。您最接近的选择是fn:replace(),如下所示,假设所讨论的非转义HTML内容是通过${bean.content}提供的。
fn:replace()
${bean.content}
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>...${fn:replace(fn:replace(bean.content, '<','<'), '>','>')}
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
${fn:replace(fn:replace(bean.content, '<','<'), '>','>')}
字符串如果你有更多的字符需要解转义,而不仅仅是<和>,它只会变得丑陋和乏味。最安全的方法是引入一个自定义EL函数,该函数依次调用Apache Commons LangStringEscapeUtils#unescapeXml()或unescapeHtml4()方法。如果还没有完成,请将download和commons-lang.jar放入/WEB-INF/lib中。然后创建一个/WEB-INF/functions.tld文件,如下所示:
<
>
StringEscapeUtils#unescapeXml()
unescapeHtml4()
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> <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>
<?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)}
<%@taglib prefix="f" uri="http://example.com/functions" %>
${f:escapeXml(bean.content)}
型
无关具体的问题,我个人会退后一步。你到底为什么要逃避HTML摆在首位?很奇怪。通常,转义应该发生在HTML中-我宁愿查找负责转义HTML的人,然后更改它,使其不再不必要地转义HTML。也许负责的人并没有真正理解网页中HTML转义的概念,以及在请求处理过程中手动执行转义,这是一个轻率的XSS预防尝试的一部分。
mklgxw1f2#
为什么不考虑使用JSP自定义标记呢?通过使用自定义标记,您可以对标记进行更多的控制。http://javatips.info/jsp-custom-tag.html对于您的情况,您可以在文章中找到示例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>
<%@taglib uri="http://javatips.info/simple-tag" prefix="spl"%>
<spl:splWithBody color="red" headerColor="cyan"><p>This is the news</p></spl:splWithBody>
字符串
浏览器输出:
SimpleTagSupport:with body ->这是新闻
mzillmmw3#
使用下面的代码:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>...<c:out value="${yourEscapedHTML}" escapeXml="false" />...
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:out value="${yourEscapedHTML}" escapeXml="false" />
3条答案
按热度按时间pdtvr36n1#
JSTL不提供专门针对非转义HTML(也不提供XML)的标记或函数。您最接近的选择是
fn:replace()
,如下所示,假设所讨论的非转义HTML内容是通过${bean.content}
提供的。字符串
如果你有更多的字符需要解转义,而不仅仅是
<
和>
,它只会变得丑陋和乏味。最安全的方法是引入一个自定义EL函数,该函数依次调用Apache Commons Lang
StringEscapeUtils#unescapeXml()
或unescapeHtml4()
方法。如果还没有完成,请将download和commons-lang.jar
放入/WEB-INF/lib
中。然后创建一个/WEB-INF/functions.tld
文件,如下所示:型
最后,就像下面这样使用它:
型
无关具体的问题,我个人会退后一步。你到底为什么要逃避HTML摆在首位?很奇怪。通常,转义应该发生在HTML中-我宁愿查找负责转义HTML的人,然后更改它,使其不再不必要地转义HTML。也许负责的人并没有真正理解网页中HTML转义的概念,以及在请求处理过程中手动执行转义,这是一个轻率的XSS预防尝试的一部分。
mklgxw1f2#
为什么不考虑使用JSP自定义标记呢?通过使用自定义标记,您可以对标记进行更多的控制。
http://javatips.info/jsp-custom-tag.html
对于您的情况,您可以在文章中找到示例2或4。
把你的内容作为你的jsp中标记的主体:
字符串
浏览器输出:
SimpleTagSupport:with body ->这是新闻
mzillmmw3#
使用下面的代码:
字符串