如何从Grails中的UrlMapping中排除特定关键字?

时间:2013-06-09 12:21:30

标签: grails grails-2.0 url-mapping

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

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

映射网址,例如 mydomain.com/someusername

如何将约束附加到网址映射以排除“登录”,“注销”等关键字...

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

3 个答案:

答案 0 :(得分:14)

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

"/$id"{
  controller = "user"
  action = "show"
  constraints {
    //add a validator for $id from url mapping
    id(validator: {
        return !(it in ['login', 'logout'])
    })
  }
}    

答案 1 :(得分:2)

使用filter,并从中重定向。

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
                }
            }
        }
    }
}

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

了解更多:

答案 2 :(得分: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"您将按预期发送给用户:view:userid。