1

外部アプリ(app2)にリダイレクトすることになっているapp1に次のフィルターがあります。

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 ではなくコードで実装できるソリューションが必要です。

ありがとう

4

2 に答える 2

4

次のような汎用リダイレクト コントローラを定義します。

class RedirectController {

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

UrlMappings で、404 をこのコントローラーにポイントします。

class UrlMappings {

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

実際には、フィルターを処理する代わりに、ここですべてのリダイレクト関係を定義できます。

于 2012-12-21T15:54:39.150 に答える
1

コントローラー名だけでなくURIでもフィルターの範囲を設定できます。試してください:

def filters = {
    all(uri:'/**') {
于 2012-12-21T13:20:02.687 に答える