在<h:outputtext escape =“false”>中显示来自DB的HTML会导致HTML页面损坏</h:outputtext>

时间:2012-02-08 15:29:09

标签: html jsf jsf-2 primefaces

有没有办法设置Firefox和Chrome在h:outputText标记中使用escape = false属性。当某些html需要在浏览器中显示时,Firefox和Chrome会正确显示已解析的字符串,但应用程序中的任何其他链接都会被冻结(??)。

来自db的示例html:

<HEAD>
<BASE href="http://"><META content="text/html; charset=utf-8" http-equiv=Content-Type>          
<LINK rel=stylesheet type=text/css href=""><META name=GENERATOR content="MSHTML 9.00.8112.16434">
</HEAD>
<BODY><FONT color=#000000 size=2 face="Segoe UI">läuft nicht</FONT></BODY>

在页面上解析HTML:

läuftnicht

非常奇怪的是,在IE中一切正常(通常是相反的)。

我使用primefaces组件(v2.2),. xhtml,tomcat 7和JSF 2.0

2 个答案:

答案 0 :(得分:6)

您最终会以语法invalid HTML结束:

<html>
    <head></head>
    <body>
        <head></head>
        <body>...</body>
    </body>
</html>

这是不对的。只能有一个<head><body>。浏览器的行为未指定。您需要从该HTML中删除整个 <head>和包装<body>,以便最终只使用

<FONT color=#000000 size=2 face="Segoe UI">läuft nicht</FONT>

您需要更新数据库以删除不必要的HTML,或者使用Jsoup按照请求解析此部分,如下所示:

String bodyContent = Jsoup.parse(htmlFromDB).body().html();
// ...

或者,您也可以在servlet的帮助下将其显示在HTML <iframe>中。 E.g。

<iframe src="htmlFromDBServlet?id=123"></iframe>

无关具体问题:

  1. 在数据库中存储HTML是一种糟糕的设计。
  2. 如果HTML源自用户控制的输入,那么你就会有一个巨大的XSS攻击漏洞。
  3. 自1998年以来<font>标记已弃用

答案 1 :(得分:1)

在我看来,你正在尝试做一些JSF并不真正想做的事情。您不应尝试在网页中插入HTML,而应尝试在页面上显示链接并通过AJAX调用修改“呈现”属性。