【问题标题】:Escape everything but linebreaks in h:outputText转义除 h:outputText 中的换行符之外的所有内容
【发布时间】:2013-12-30 21:14:39
【问题描述】:

我有用户在文本区域中输入的文本,我想在另一个页面上显示它。

第一个问题是来自 textarea 的换行符是 \r\n 而不是 br,但我可以简单地将它们全部替换。我需要帮助的实际问题是在那之后显示它:

h:outputText 默认情况下会转义所有内容,因此要使换行符起作用,我需要使用 escape="false",但出于显而易见的原因,我不希望用户能够通过输入其他内容来弄乱页面HTML 标签,甚至更糟糕的是,Javascript。所以我需要以某种方式逃避除换行符之外的一切。

我应该怎么做?或者是否有一个不同的 JSF 组件可以让这更简单?

不幸的是,前置标签或 CSS 空白不是一个选项。

【问题讨论】:

  • 尝试使用可能解决您问题的正则表达式
  • @Noman:从不建议使用正则表达式来解析 HTML,更不用说清理来自攻击向量的输入了。这简直是​​愚蠢的。使用普通的基于堆栈的解析器并仅将正则表达式用于其设计的工作:常规语言模式匹配。 HTML 不是常规语言。
  • @BalusC 谢谢,我会记住的 :)

标签: jsf jsf-2


【解决方案1】:

除了将\n 替换为<br> 并使用<h:outputText escape="false">,您还可以只显示预先格式化的文本,以便\n 显示为真正的换行符。您可以为此使用元素的CSS white-space property,它可以设置为prepre-wrappre-line

例如

<h:outputText value="#{bean.text}" styleClass="preformatted" />

.preformatted {
    white-space: pre;
}

如果您真的打算将文本呈现为未转义的 HTML,那么您可以使用能够胜任这项工作的 HTML 解析器(例如 Jsoup)来清除 XSS 攻击向量。另请参阅我昨天发布的这个答案:JSF OutputText with html style

【讨论】:

  • 不幸的是,在这种特定情况下我不能使用空格,但我会看看 Jsoup。令人遗憾的是,JSF 中没有内置的方式来执行此操作。你会认为从 textarea 打印文本是很常见的用例......
  • JSF 是 HTML 生成器,而不是 HTML 解析器。只需使用正确的工具来完成这项工作。 CSS 将是为 HTML 演示文稿设置样式的正确工具。你因为一些不清楚的原因不能这样做不是 JSF 的错。
猜你喜欢
  • 1970-01-01
  • 2019-11-19
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
相关资源
最近更新 更多