当当前应用程序中不存在控制器时,如何使用过滤器重定向到外部URL

时间:2012-12-21 11:44:08

标签: grails redirect

我在app1中有以下过滤器,它应该重定向到外部应用程序(app2)。

class MyFilters {
    def userService
    def springSecurityService

    def filters = {
        all(controller: '*', action: '*') {
            before = {
                String userAgent = request.getHeader('User-Agent')

                int buildVersion = 0

                // Match "app-/{version}" where {version} is the build number
                def matcher = userAgent =~ "(?i)app(?:-\\w+)?\\/(\\d+)"

                if (matcher.getCount() > 0)
                {                   
                    buildVersion = Integer.parseInt(matcher[0][1])

                    log.info("User agent is from a mobile with build version = " + buildVersion)
                    log.info("User agent = " + userAgent)

                    String redirectUrl = "https://anotherdomain.com"

                    if (buildVersion > 12)
                    {
                        if (request.queryString != null)
                        {
                            log.info("Redirecting request to anotherdomain with query string")
                            redirect(url:"${redirectUrl}${request.forwardURI}?${request.queryString}",params:params)
                        }

                        return false
                    }
                }
            }
            after = { model ->
                if (model) {
                    model['currentUser'] = userService.currentUser
                }
            }
            afterView = {

            }
        }
    }

}

当对app1的请求包含app1中不存在控制器名称的URI时会出现问题(但是在我要重定向到的app2中)。

如何在追加相同URI的情况下将请求重定向到app2? (无论它们是否存在于app1中)。

我怀疑过滤器不是正确的解决方案,因为如果应用程序中不存在控制器,它将永远不会进入它们。

理想情况下,我需要一个可以通过代码而不是apache实现的解决方案。

由于

2 个答案:

答案 0 :(得分:3)

定义一个通用的重定向控制器,如下所示:

class RedirectController {

def index() {
        redirect(url: "https://anotherdomain.com")
    }
}

在UrlMappings中,指向该控制器的404:

class UrlMappings {

    static mappings = {
        ......
        "404"(controller:'redirect', action:'index')
            ......
    }
}

实际上,您可以在此处定义所有重定向关系,而不是处理过滤器。

答案 1 :(得分:1)

您可以通过URI以及控制器名称set the scope of a filter尝试:

def filters = {
    all(uri:'/**') {