Validation 以干式方式验证每个请求的RESTful URL
我们的Grails2.4.4应用程序始终使用RESTful URL。给定以下URL: /商店/123/产品/456 我想验证是否有一个ID为123的商店,如果没有,则在向产品控制器发出的每个请求中重定向到404。我不想在每个操作方法中都放入存储查找代码,也不想创建控制器基类,因为这样我就必须在每个操作方法中都放入方法调用Validation 以干式方式验证每个请求的RESTful URL,validation,rest,grails,Validation,Rest,Grails,我们的Grails2.4.4应用程序始终使用RESTful URL。给定以下URL: /商店/123/产品/456 我想验证是否有一个ID为123的商店,如果没有,则在向产品控制器发出的每个请求中重定向到404。我不想在每个操作方法中都放入存储查找代码,也不想创建控制器基类,因为这样我就必须在每个操作方法中都放入方法调用 这可以通过拦截器实现吗?我认为您可以通过以下方式实现: URL映射 过滤器 但我不认为在URL映射中加入逻辑(检查是否存在具有给定id的有效存储)是个好主意,所以最好使用过滤器
这可以通过拦截器实现吗?我认为您可以通过以下方式实现:
"/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)
}
}
}
}
}
拦截器是在Grails3.0中引入的。您需要在Grails2.4.4中使用
before={}
是这里需要的
还可以查看文档,默认情况下哪些变量可用于过滤器(例如:参数、请求、响应等)。如果这仍然不清楚,我可以添加一个答案作为示例。但我希望这些文件是不言自明的。作为一个例子,我会这样做
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
}
}
}
}
}
在Grails2.4.4中,过滤器可用于拦截对
ProductController
的请求params.storeId=123
和params.id=456
Store.exists()
将检查strore id为123的存储是否存在。否则,重定向到404页,返回false。在Grails3.0中,过滤器已被弃用,类似的实现可以使用来完成。谢谢。我看了一下拦截器,before()在action方法之后触发,但就在视图呈现之前,这太晚了。我遗漏了什么吗?Grails3.0中引入了拦截器。您需要在Grails2.4.4中使用<这里需要的是code>before={}。还可以查看文档,默认情况下哪些变量可用于过滤器(例如:参数、请求、响应等)。如果这仍然不清楚,我可以添加一个答案作为示例。但我希望这些文件是不言自明的,明白了。谢谢请把你最后的评论作为回答,我会接受的。