覆盖Grails重定向方法

时间:2016-04-07 14:45:55

标签: grails

我在网址中携带Grails应用程序的区域设置,例如

http://myapp.com/LANG/controller/action/id

因此,我使用language属性调整了URLMappings.groovy。由于我想保存工作并且不在每个链接上应用lang参数,因此我使用params.lang中的语言覆盖了g:link taglib。这非常好。

当我从控制器进行重定向时,例如

redirect(action: "logout")

我想自动附加params.lang而不是每次都写

redirect(action: "logout", params: [lang: params.lang])

我找到了帖子grails override redirect controller method,但我不确定如何继续。这段代码在哪里参与?

如何覆盖redirect()方法并添加params.lang-attribute?

请指教,非常感谢。

1 个答案:

答案 0 :(得分:1)

在您的应用程序中执行此操作的最简单方法是使用一些元编程,并为您的Grails应用程序使用BootStrap.groovy。以下只是一个简单的例子:

import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes

class BootStrap {

    def init = { servletContext ->
        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 ->
               // new pre-redirect logic
               if (!args['params']) args['params'] = [:] // just in case redirect was called without any parameters
               args['params']['whatever'] = 'something' // add something into the parameters map

               oldRedirect.invoke delegate, args
               // new post-redirect logic
            }
        }

    }
    def destroy = {
    }
}

上面的示例只是在Grails应用程序中的所有控制器上包含redirect的实现,并注入一个名为whatever的新参数,其值为something

使用Grails 2.4.2(快速)测试上述内容。