我有一个包含图像和文本的 html 字符串。在渲染时,我只想渲染文本而不是图像。
我试图这样做:
<h:outputText escape="false" value="#{fn:replace(answerBlock.content,'<img>','')}" />
但这返回了一个格式错误的 html,然后在屏幕上呈现。
如何跳过 img 标签并仅在 jsf 中呈现文本?
不要使用字符串或正则表达式函数来操作用户控制的 HTML。在这个特定示例中,XSS 攻击漏洞的风险非常大,因为并未涵盖所有方面(例如<script>
,onclick
等)。只需使用真正了解 XSS 含义的 HTML 解析器。例如Jsoup,它也有一个白名单清理功能。
String sanitizedHtml = Jsoup.clean(dirtyHtml, Whitelist.basic());
然后改为显示:
<h:outputText value="#{bean.sanitizedHtml}" escape="false" />
为了提高性能,请考虑只解析一次并将其与原始数据一起保存在数据库中。
我会在你的answerBlock
bean 中添加代码。就像是:
public String imageStrippedContent() {
return stripImgTags( content() );
}
private String stripImgTags( String html ) {
// strip img tag using dom parser like jtidy, or maybe regex
...
}
然后将您的 facelet 修改为:
<h:outputText escape="false" value="#{answerBlock.imageStrippedContent} />