我在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。
答案 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。