如何使用JSTL转换HTML标记

时间:2015-12-09 05:20:19

标签: jsp escaping jstl

我必须使用JSTL在页面中显示已经转义的HTML标记的一些内容。

我知道excapeXml用于转义可以解释为标记的字符。但似乎它只适用于普通和非转义HTML:<p>This is the news</p>,它对已经转义的HTML无法正常运行:&lt;p&gt;This is the news&lt;/p&gt;

那么,我怎样才能通过JSTL转义HTML?

2 个答案:

答案 0 :(得分:5)

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 Lang StringEscapeUtils#unescapeXml()unescapeHtml4()方法。如果尚未完成,请download并在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>

最后只需使用如下:

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

无关,我个人会后退一步。为什么你在第一时间完全逃脱了HTML?这很奇怪。通常,转义应该仅在HTML呈现期间发生。我宁愿查找负责转义该HTML的人,然后将其更改为不再不必要地转义HTML。也许那个负责的人并没有真正理解围绕HTML转义网页的概念,并且在请求处理过程中手动执行转义,作为无意义的XSS预防尝试的一部分。这就是食物:XSS prevention in JSP/Servlet web application

答案 1 :(得分:1)

为什么不考虑使用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 - &gt; &lt; p&gt;这是新闻&lt; / p&gt;