如何使用JSTL对HTML标签进行转义

Sky*_*Sky 1 jsp jstl escaping

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

我知道的excapeXml是用于转义可以解释为标记的字符。但似乎这只是工作了平原和转义HTML: <p>This is the news</p>,它不能正确的工作已经逃脱HTML: &lt;p&gt;This is the news&lt;/p&gt;

那么,如何使用JSTL来对已经转义的HTML进行转义?

Bal*_*usC 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;','>')}
Run Code Online (Sandbox Code Playgroud)

如果您需要比不上<和放更多的字符,这只会变得丑陋而乏味>

您最安全的选择是引入自定义EL函数,该函数依次调用Apache Commons Lang 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>
Run Code Online (Sandbox Code Playgroud)

最后只需按以下方式使用它:

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

具体问题无关,我个人将退后一步。您为什么首先要逃脱HTML?这很奇怪。通常,转义应该仅在HTML渲染期间发生。我宁愿查找负责转义该HTML的人员,然后将其更改为不再不必要地转义HTML的方式。也许对此负责的人并没有真正理解网页中围绕HTML进行转义的概念,而是在请求处理期间手动进行了转义,这是一种未经考虑的XSS预防尝试的一部分。这是可供阅读的食物:JSP / Servlet Web应用程序中的XSS预防