Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在每个新请求提交到grails中的控制器之前执行函数_Grails_Request_Global_Intercept - Fatal编程技术网

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

如何在每个新请求提交到grails中的控制器之前执行函数,grails,request,global,intercept,Grails,Request,Global,Intercept,我需要在调用控制器中的每个def之前(在向服务器发送每个新请求之前)执行一个函数。在这个函数中,我将 1) 执行会话检查是否有效,并使用参数将请求转发到相应的操作和控制器 2) 对用户提交的参数执行消毒检查 我知道每个控制器拦截器,如何编写全局通用拦截器 在grails中如何以及在何处调用此函数? 提前感谢。您可以在控制器中使用beforeInterceptor来实现完全相同的目的。把它放到一个新的控制器中,比如说BaseController,然后放入所有你想做的事情,然后用BaseContro

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

我知道每个控制器拦截器,如何编写全局通用拦截器

在grails中如何以及在何处调用此函数?
提前感谢。

您可以在控制器中使用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 = {

    }
}
下面是一个使用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)
                    }
                }
            }
        }

谢谢Bala,现在我正在考虑过滤器的问题,我刚刚阅读了文档,但是如何为除AppStartupController(所有defs)之外的所有控制器制作过滤器,因为会话在该控制器中还不可用。。。然后在登录控制器中验证def(登录控制器-注销def中的另一个def需要进行会话检查)。如何编写此筛选器?可以使用以下语法排除某些控制器筛选器1(控制器:'book',反转:true){}。这将对除book controller(BookController)之外的所有控制器请求执行filter1。希望这有帮助。谢谢你的帮助,我现在正在通过创建一个抽象的基本控制器来实现这一点,并让所有人都对它进行扩展。在这里,我可以使用beforeInterceptor来调用函数。当然可以,我认为过滤器是一种更干净的方式。