如何在Jsf中跳过渲染图像

时间:2013-06-06 13:54:02

标签: jsf jsf-2

我有一个包含图片和文字的html字符串。渲染时,我只想呈现文本而不是图像。

我试着这样做:

<h:outputText escape="false" value="#{fn:replace(answerBlock.content,'&lt;img&gt;','')}" />

但这会返回一个格式错误的HTML,然后在屏幕上呈现。

如何跳过img标签并在jsf中渲染文本?

2 个答案:

答案 0 :(得分:5)

不要使用字符串或正则表达式函数来操纵用户控制的HTML。 XSS攻击漏洞的风险在这个特定的例子中非常大,因为并未涵盖所有方面(例如<script>onclick等)。只需使用一个知道XSS含义的真正的HTML解析器。例如Jsoup也有whitelist sanitizer feature

String sanitizedHtml = Jsoup.clean(dirtyHtml, Whitelist.basic());

然后显示:

<h:outputText value="#{bean.sanitizedHtml}" escape="false" />

要提高性能,请考虑仅解析一次并将数据库与原始数据一起保存。

另见:

答案 1 :(得分:0)

我会向你的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} />