5

我在 Grails 中使用以下 url 映射:

"/$id"{
  controller = "user"
  action = "show"
}       

映射像mydomain.com/someusername这样的 url

如何将约束附加到 url 映射以排除“login”、“logout”等关键字

即,mydomain.com/someusername 应该路由到 mydomain.com/user/show/someusername,mydomain.com/login 不应该路由到 mydomain.com/user/show/login。

4

3 回答 3

14

您可以为此映射使用约束:

"/$id"{
  controller = "user"
  action = "show"
  constraints {
    //add a validator for $id from url mapping
    id(validator: {
        return !(it in ['login', 'logout'])
    })
  }
}    
于 2013-06-09T15:59:07.587 回答
2

使用过滤器,并从中重定向。

class UrlMappingFilters {
    def filters = {
        filterUrlKeywords(controller: '*', action: '*') {
            def keywords = ['login', 'logout']
            before = {
                if (params.id in keywords) {
                    // redirect to start, or render error...
                    redirect(uri: '/')
                    return false
                }
            }
        }
    }
}

如果您想使其特定于控制器或操作,请使用其名称而不是'*'.

阅读更多:

于 2013-06-09T13:59:45.400 回答
1

我已经为基于 REST 的端点做了很多次这种类型的事情,而 Grails 足够聪明,可以弄清楚你想要什么。 请注意,UrlMappings 文件中的排序可能很重要

例如,您可以这样定义:

class UrlMappings {
    static mappings = {
        "/login" { controller: 'auth', action: 'login' }
        "/logout" { controller: 'auth', action: 'logout' }
        "/$id" { controller: 'user', action: 'view' }
    }
}

然后,当您点击“/login”时,您将进入 auth:login 方法,但是当您点击“/userid”时,您将按预期发送到 user:view:userid。

于 2016-01-22T16:30:15.400 回答