在<h:outputText escape ="false">中显示来自DB的HTML会导致HTML页面损坏

Nik*_*ola 0 html jsf primefaces jsf-2

有没有办法设置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>
Run Code Online (Sandbox Code Playgroud)

在页面上解析HTML:

läuftnicht

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

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

Bal*_*usC 6

您最终会以这种方式使用语法无效的 HTML:

<html>
    <head></head>
    <body>
        <head></head>
        <body>...</body>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

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

<FONT color=#000000 size=2 face="Segoe UI">läuft nicht</FONT>
Run Code Online (Sandbox Code Playgroud)

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

String bodyContent = Jsoup.parse(htmlFromDB).body().html();
// ...
Run Code Online (Sandbox Code Playgroud)

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

<iframe src="htmlFromDBServlet?id=123"></iframe>
Run Code Online (Sandbox Code Playgroud)

具体问题无关:

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