我们的Grails 2.4.4应用程序始终使用RESTful URL。给出以下URL:
/存储/ 123 /产品/ 456
我想验证存在ID为123的商店,如果没有,则在每次向产品控制器发出请求时重定向到404。我不想在每个操作方法中放置存储查找代码,也不想创建控制器基类,因为那时我必须在每个操作方法中放置一个方法调用。
这可以用拦截器以某种方式完成吗?
答案 0 :(得分:1)
Grails 3.0中引入了拦截器。在Grails 2.4.4中你需要filters。
before = { }
是这里需要的。
另请查看默认情况下哪些变量可用于过滤器的文档(例如:params,request,response等)。如果仍然不清楚,我可以添加一个答案作为例子。但我希望文档能够自我解释。作为一个例子,我会这样做
class EntityCheckFilters {
def filters = {
storeExistCheck( controller:'product' ) {
before = {
if ( !params.storeId || !Store.exists( params.sotreId as Long ) ) {
response.sendError(404)
// or for example if you have a separate action to handle 404
// redirect(action: 'handle404')
// this is important,
// because we do not want to pass through with the original call
return false
}
}
}
}
}
答案 1 :(得分:0)
我认为您可以使用以下方式执行此操作:
但我不认为在URL Mapping中设置逻辑(检查是否存在具有给定id的有效商店)是个好主意,所以最好使用Filters。
所以你的网址映射将如下所示:
"/stores/$storeId/products/$productId" (controller = "product")
你的过滤器:
class YourFilterNameFilters {
def filters = {
secureReports(controller:'*', action:'*') {
before = {
if(parmas.controller == "product" && params.storeId){
Store store = Store.get(params.sotreId)
if(!store){
response.sendError(404)
}
}
}
}
}