4

我需要在调用控制器中的每个 def 之前执行一个函数(在每个新请求发送到服务器之前)。在此功能中,我将 1) 进行会话检查是否有效,使用参数将请求转发到适当的操作和控制器 2) 对用户提交的参数进行清理检查

我知道每个控制器拦截器,我怎样才能编写一个全局通用拦截器。

如何以及在哪里可以在 grails 中调用此函数?提前致谢..

4

3 回答 3

6

您可以在 Controller 中使用 beforeInterceptor 来达到完全相同的目的。把它放到一个新的控制器中,比如 BaseController 并放入所有你想做的东西,然后用 BaseController 扩展你现有的所有控制器,你就可以开始了。有关 beforeInterceptor 的更多信息,请单击此处

注意:如果您已经有一些由所有其他控制器扩展的通用控制器,则无需实现新控制器。只需在该控制器本身中实现 ​​beforeInterceptor 即可。

或者,您可以实现一个过滤器并在该过滤器中执行所有操作。有关 Grails 中过滤器的更多信息,请单击此处

于 2012-03-27T02:05:44.580 回答
4

您可以通过以下方式添加过滤器来拦截每个动作


class AbcFilters {
 def filters = {
  abc1(controller: '*', action: '*') {
  }

  abc2(controller: '*Test', action: '*') {
  }


  abc2(controllerExclude: 'AppStartup*', action: '*') {

  }
 }
}
于 2012-03-27T04:47:50.673 回答
3

这是每个控制器中每个操作的过滤器:

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)
                    }
                }
            }
        }
于 2012-03-27T04:56:46.777 回答