如何在将每个新请求提交给grails中的控制器之前执行函数

时间:2012-03-27 01:41:51

标签: grails request global intercept

我需要在调用控制器中的每个def之前执行一个函数(在每个新请求发送到服务器之前)。在这个功能我会 1)进行会话检查是否有效将请求转发给相应的操作&控制器与params 2)对用户提交的参数进行消毒检查

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

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

3 个答案:

答案 0 :(得分:6)

您可以在Controller中使用beforeInterceptor以实现完全相同的目的。把它放到一个新的控制器说BaseController并输入你想要做的所有东西,然后使用BaseController扩展所有现有的控制器,你就可以开始了。有关beforeInterceptor Click here

的更多信息

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

或者,您可以实施过滤器并在该过滤器中执行所有操作。有关Grails Click Here

中过滤器的更多信息

答案 1 :(得分:4)

您可以按以下方式添加过滤器以拦截每个操作


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

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


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

  }
 }
}

答案 2 :(得分:3)

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

all(controller: '*', action: '*') {
    before = {

    }
    after = {

    }
    afterView = {

    }
}

这是一个使用spring security的会话检查过滤器:

     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)
                    }
                }
            }
        }