如何在Grails错误消息中显示HTML而不丢失用户提供内容的编码?

如何在Grails错误消息中显示HTML而不丢失用户提供内容的编码?,html,validation,grails,Html,Validation,Grails,我需要在Grails错误消息中显示一些HTML,为我无法影响的外部系统标记一些内容。它只是一些简单的span标记,带有class=“notranslate”属性。默认情况下,HTML将被转义,因此我禁用了标记中的编解码器,这导致了另一个问题: 现在,用户输入的所有内容都将显示在页面的HTML中,从而启用easy XSS。。。 目前我的解决方案是只禁用此页面的HTML编解码器,并使用自定义错误消息,这些消息不包括用户输入的内容,但在我看来这相当笨拙 我还看到可能会随意处理MessageSource

我需要在Grails错误消息中显示一些HTML,为我无法影响的外部系统标记一些内容。它只是一些简单的span标记,带有class=“notranslate”属性。默认情况下,HTML将被转义,因此我禁用了标记中的编解码器,这导致了另一个问题:

现在,用户输入的所有内容都将显示在页面的HTML中,从而启用easy XSS。。。 目前我的解决方案是只禁用此页面的HTML编解码器,并使用自定义错误消息,这些消息不包括用户输入的内容,但在我看来这相当笨拙

我还看到可能会随意处理MessageSource,但我不喜欢在Grails内部进行太多更改。我的另一个想法是创建一个自定义过滤器,只允许我批准的HTML通过。我也放弃了这个想法,感觉我在错误的抽象层次上处理问题

你知道怎么解决这个问题吗

TL;博士
我需要将错误消息的可变部分包装在标记中。

我想到了一个taglib包装器。从这个开始:

<g:hasErrors bean="${user}">
  <ul>
   <g:eachError var="err" bean="${user}">
       <li><g:message error="${err}" /></li> 
   </g:eachError>
  </ul>
</g:hasErrors>
三个安培是一个怀尔德。然后创建一个taglib,它包装
g:message
,如下所示:

user.username.size.toosmall=Username you provided @@@{0}@@@ is too small.
class MyTagLib {
    def spanErrorMessage = { attrs, body ->
        out << message(error: attrs.error).replaceAll(/@@@.*@@@/, "<span class='notranslate'>\\1</span>")
    }
}
<g:hasErrors bean="${user}">
  <ul>
   <g:eachError var="err" bean="${user}">
       <li><g:spanErrorMessage error="${err}" /></li> 
   </g:eachError>
  </ul>
</g:hasErrors>

这段代码未经测试,没有经过头脑,因此它可能会错过正则表达式中的一些细节,但我希望您能理解。

我有一个关于taglib包装器的想法。从这个开始:

<g:hasErrors bean="${user}">
  <ul>
   <g:eachError var="err" bean="${user}">
       <li><g:message error="${err}" /></li> 
   </g:eachError>
  </ul>
</g:hasErrors>
三个安培是一个怀尔德。然后创建一个taglib,它包装
g:message
,如下所示:

user.username.size.toosmall=Username you provided @@@{0}@@@ is too small.
class MyTagLib {
    def spanErrorMessage = { attrs, body ->
        out << message(error: attrs.error).replaceAll(/@@@.*@@@/, "<span class='notranslate'>\\1</span>")
    }
}
<g:hasErrors bean="${user}">
  <ul>
   <g:eachError var="err" bean="${user}">
       <li><g:spanErrorMessage error="${err}" /></li> 
   </g:eachError>
  </ul>
</g:hasErrors>

这段代码未经测试,不在头脑中,因此它可能会错过正则表达式中的一些细节,但我希望您能理解。

为了不获得HTML编码的错误提示消息,可以使用以下方法:

<g:hasErrors bean="${editingInstance}">
    <div class="errors">
        <g:renderErrors bean="${editingInstance}" codec="none"/>
    </div>
</g:hasErrors>

为了不获取HTML编码的错误闪存消息,可以使用以下方法:

<g:hasErrors bean="${editingInstance}">
    <div class="errors">
        <g:renderErrors bean="${editingInstance}" codec="none"/>
    </div>
</g:hasErrors>