【发布时间】:2019-12-16 16:36:01
【问题描述】:
我是 grails 的新手,我正在尝试覆盖 groovy 控制器中的重定向方法。我推荐了这个Override Grails redirect method。但我不明白如何访问并将 http 请求参数传递给 BootStrap.groovy 中的重定向覆盖。
redirect(action: "logout", params: [lang: params.lang])
【问题讨论】:
我是 grails 的新手,我正在尝试覆盖 groovy 控制器中的重定向方法。我推荐了这个Override Grails redirect method。但我不明白如何访问并将 http 请求参数传递给 BootStrap.groovy 中的重定向覆盖。
redirect(action: "logout", params: [lang: params.lang])
【问题讨论】:
如果您通过控制器上的元类实现包装器(就像您在链接问题中提到的那样),您可以通过实现闭包中的“委托”简单地访问“活动”控制器对象:
def ctx = servletContext.getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT)
def app = ctx.getBean("grailsApplication")
app.controllerClasses.each() { controllerClass ->
def oldRedirect = controllerClass.metaClass.pickMethod("redirect", [Map] as Class[])
controllerClass.metaClass.redirect = { Map args ->
// delegate is the instance of <controllerClass> where "redirect" just gets executed.
// the current http request can be accessed via a getter on controller classes
println delegate.getRequest()
oldRedirect.invoke delegate, args
}
}
或者,您可以使用 RequestContextHolder 获取当前 requestAttributes 并从那里提取请求(请参阅 Grails 2 中的 org.codehaus.groovy.grails.plugins.web.api.CommonWebApi.java 或 grails.web.api。 Grails 3) 中的 ServletAttributes.groovy
【讨论】: