我需要在调用控制器中的每个 def 之前执行一个函数(在每个新请求发送到服务器之前)。在此功能中,我将 1) 进行会话检查是否有效,使用参数将请求转发到适当的操作和控制器 2) 对用户提交的参数进行清理检查
我知道每个控制器拦截器,我怎样才能编写一个全局通用拦截器。
如何以及在哪里可以在 grails 中调用此函数?提前致谢..
您可以在 Controller 中使用 beforeInterceptor 来达到完全相同的目的。把它放到一个新的控制器中,比如 BaseController 并放入所有你想做的东西,然后用 BaseController 扩展你现有的所有控制器,你就可以开始了。有关 beforeInterceptor 的更多信息,请单击此处
注意:如果您已经有一些由所有其他控制器扩展的通用控制器,则无需实现新控制器。只需在该控制器本身中实现 beforeInterceptor 即可。
或者,您可以实现一个过滤器并在该过滤器中执行所有操作。有关 Grails 中过滤器的更多信息,请单击此处
您可以通过以下方式添加过滤器来拦截每个动作
class AbcFilters {
def filters = {
abc1(controller: '*', action: '*') {
}
abc2(controller: '*Test', action: '*') {
}
abc2(controllerExclude: 'AppStartup*', action: '*') {
}
}
}
这是每个控制器中每个操作的过滤器:
all(controller: '*', action: '*') {
before = {
}
after = {
}
afterView = {
}
}
这是一个使用弹簧安全性的会话检查过滤器:
auditEntry(controller:'*', action:'*') {
before = {
if (session.isNew()){
def userName
def principal = SCH?.context?.authentication?.principal
if (principal instanceof String){
userName = principal
log.info "Anonymous user has logged into the application."
}else{
userName = principal?.username
log.info "User $userName has logged into the application."
log.debug (principal)
}
}
}
}