【问题标题】:How to validate Domain Classes correctly when Properties are HTML Encoded in Grails?在 Grails 中对属性进行 HTML 编码时如何正确验证域类?
【发布时间】:2013-07-28 13:59:33
【问题描述】:

我对表单输入字段使用 html 编码。我有一个创建新用户对象的表单,可以在其中插入新用户的名称。为了防止此输入字段被脚本注入,我在下面列出的 save() 操作中执行 encodeAsHTML()

问题: 1.输入的名称是:Schäfchen 2.在我下面的验证规则之后,这将被正确验证 3. html encoding将ä转换为\auml,验证失败

如何实现正确验证 html 编码的名称?

给定以下 Grails 类:

class User {
  String name
  static constraints = {
    name blank: false, validator: { val, obj ->                     
                Pattern pattern = Pattern.compile("[a-zA-Z0-9äöüßÄÖÜ\\- ]+")
        pattern.matcher(val).matches()
    }
  }
}

在我的 UserController.groovy 中:

dev save() {
  def name = params?.name?.encodeAsHTML()
  def user = new User()
  user.name = name
  user.save()
}

【问题讨论】:

  • 为什么在域中将数据编码为html?在页面上显示时,您可以始终/应该将其编码为 html。
  • 你能给出一些示例代码吗?什么时候使用 encodeAsHTML() 什么时候使用 decodeHTML() ?

标签: grails grails-2.0 grails-domain-class


【解决方案1】:

您应该只在您的 GSP 视图中使用 encodeAsHTML()。

见:http://grails.org/doc/latest/ref/Tags/each.html

<tbody>
 <g:each status="i" in="${itemList}" var="item">
  <!-- Alternate CSS classes for the rows. -->
  <tr class="${ (i % 2) == 0 ? 'a' : 'b'}">
   <td>${item.id?.encodeAsHTML()}</td>
   <td>${item.parentId?.encodeAsHTML()}</td>
   <td>${item.type?.encodeAsHTML()}</td>
   <td>${item.status?.encodeAsHTML()}</td>
 </tr>
 </g:each>
</tbody>

【讨论】:

  • 您可以将 html 设置为默认编码,而不是一遍又一遍地这样做。 grails.views.default.codec = "html"
  • 使用您的解决方案,您会遇到一些插件的问题。
猜你喜欢
  • 2014-10-31
  • 1970-01-01
  • 2014-10-25
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
  • 1970-01-01
相关资源
最近更新 更多