【问题标题】:how to execute a function before each new request is submitted to a controller in grails如何在每个新请求提交到grails中的控制器之前执行一个函数
【发布时间】:2012-03-27 01:41:51
【问题描述】:

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

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

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

【问题讨论】:

标签: grails request global intercept


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢巴拉,现在我正在考虑过滤器的行,我刚刚阅读了文档,但是如何为除 AppStartupController(all defs) 之外的所有控制器制作过滤器,因为会话在此不可用控制器尚未...然后登录控制器中的auth def(登录控制器中的另一个def - 注销def需要进行会话检查)。这个过滤器怎么写?
  • 您可以使用以下语法排除某些控制器 filter1(controller:'book', invert:true) { }。这将为除图书控制器 (BookController) 之外的所有控制器请求执行 filter1。希望这会有所帮助。
【解决方案2】:

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


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

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


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

  }
 }
}

【讨论】:

    【解决方案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)
                        }
                    }
                }
            }
    

    【讨论】:

    • 感谢您的帮助,我现在正在通过创建一个 Abstract Base 控制器并对其进行扩展。在这我可以拥有调用函数的 beforeInterceptor。
    • 当然可以,不过我认为过滤器是一种更清洁的方式。
    猜你喜欢
    • 2019-09-14
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2017-09-12
    • 2019-03-22
    • 2018-05-04
    相关资源
    最近更新 更多