中显示来自 DB 的 HTML导致 HTML 页面损坏" />

中显示来自 DB 的 HTML导致 HTML 页面损坏

发布于 2025-01-03 11:44:43 字数 675 浏览 1 评论 0 原文

有没有办法设置 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äuft nicht

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

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

Is there any way to setup Firefox and Chrome to work with escape=false attribute in h:outputText tag. When there is some html that needs to be shown in the browser, Firefox and Chrome show parsed string correctly, but any other links in application are freezed (??).

The example html from db:

<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>

Parsed HTML on the page:

läuft nicht

What is very weird, is that in IE everything works (usually it is opposite).

I use primefaces components (v2.2), .xhtml, tomcat 7 and JSF 2.0

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

我为君王 2025-01-10 11:44:43

这样,您最终会得到语法上无效 HTML:

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

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

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

您需要更新数据库以删除不必要的 HTML,或使用 Jsoup 来解析此部分根据每个请求发出类似的内容如下所示:

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

或者,您也可以在 HTML

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

与具体问题无关

  1. 将 HTML 存储在数据库中是一个糟糕的设计。
  2. 如果 HTML 源自用户控制的输入,那么您将面临巨大的 XSS 攻击漏洞。
  3. 自 1998 年以来, 标签已被弃用

You end up with syntactically invalid HTML this way:

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

This is not right. There can be only one <head> and <body>. The browsers will behave unspecified. You need to remove the entire <head> and the wrapping <body> from that HTML so that you end up with only

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

You'd need to either update the DB to remove unnecessary HTML, or to use Jsoup to parse this piece out on a per-request basis something like as follows:

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

Alternatively, you could also display it inside a HTML <iframe> instead with help of a servlet. E.g.

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

Unrelated to the concrete problem:

  1. Storing HTML in a DB is a terrible design.
  2. If the HTML originates from user-controlled input, you've a huge XSS attack hole this way.
  3. The <font> tag is deprecated since 1998.
∞觅青森が 2025-01-10 11:44:43

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

It seems to me that you're trying to do something that JSF was not really meant to do. Rather than try to insert HTML in your web page, you ought to try having the links already on your page and modifying the "rendered" attribute through an AJAX call.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文