我从Grails开始,正在关注InfoQ电子书中发现的here。
该书在第9章中介绍了身份验证以及如何加密密码。下面显示了它是如何完成的,但是我不知道它是如何工作的。
首先,我们需要在grails-app/utils/SHACodec.groovy
中创建一个类:
import java.security.MessageDigest
class SHACodec{
static encode = { target->
MessageDigest md = MessageDigest.getInstance('SHA')
md.update(target.getBytes('UTF-8'))
return new String(md.digest()).encodeAsBase64()
}
}
然后在我的
User domain
中,我需要在beforeInsert
中添加一个闭包:class User{
...
String password
def beforeInsert = {
password = password.encodeAsSHA()
password
}
...
}
该代码运行良好,但是我看不到如何在
grails-app/utils/SHACodec.groovy
中添加类的关联使encodeAsSHA()
中的password
可以使用User domain
函数。由于
SHACodec
类仅为encode
分配一个闭包,而从不提及encodeAsSHA()
。 password
(一种String
)如何能够无处不在使用它?我肯定在这里错过了一些东西!
最佳答案
Grails编解码器类可以包含编码闭包,解码闭包或两者。当Grails应用程序启动时,Grails框架会从grails-app / utils /目录动态加载编解码器。
该框架在grails-app / utils /下查找以约定Codec结尾的类名称。例如,Grails附带的标准编解码器之一就是HTMLCodec。
如果编解码器包含编码闭包,则Grails将创建一个动态编码方法,并将该方法添加到Object类中,其名称表示定义了编码闭包的编解码器。例如,HTMLCodec类定义了一个编码闭包,因此Grails为其附加了名为encodeAsHTML的名称。
关于grails - encodeAsSHA()函数从何而来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13447138/