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

prdp8dxp  于 5个月前  发布在  其他
关注(0)|答案(3)|浏览(38)

我必须显示一些内容与已经逃脱的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}提供的。

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

字符串
如果你有更多的字符需要解转义,而不仅仅是<>,它只会变得丑陋和乏味。
最安全的方法是引入一个自定义EL函数,该函数依次调用Apache Commons LangStringEscapeUtils#unescapeXml()unescapeHtml4()方法。如果还没有完成,请将downloadcommons-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>


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

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

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

mklgxw1f

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">&lt;p&gt;This is the news&lt;/p&gt;</spl:splWithBody>

字符串

浏览器输出:

SimpleTagSupport:with body ->这是新闻

mzillmmw

mzillmmw3#

使用下面的代码:

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

字符串

相关问题