Validation 以干式方式验证每个请求的RESTful URL

Validation 以干式方式验证每个请求的RESTful URL,validation,rest,grails,Validation,Rest,Grails,我们的Grails2.4.4应用程序始终使用RESTful URL。给定以下URL: /商店/123/产品/456 我想验证是否有一个ID为123的商店,如果没有,则在向产品控制器发出的每个请求中重定向到404。我不想在每个操作方法中都放入存储查找代码,也不想创建控制器基类,因为这样我就必须在每个操作方法中都放入方法调用 这可以通过拦截器实现吗?我认为您可以通过以下方式实现: URL映射 过滤器 但我不认为在URL映射中加入逻辑(检查是否存在具有给定id的有效存储)是个好主意,所以最好使用过滤器

我们的Grails2.4.4应用程序始终使用RESTful URL。给定以下URL:

/商店/123/产品/456

我想验证是否有一个ID为123的商店,如果没有,则在向产品控制器发出的每个请求中重定向到404。我不想在每个操作方法中都放入存储查找代码,也不想创建控制器基类,因为这样我就必须在每个操作方法中都放入方法调用


这可以通过拦截器实现吗?

我认为您可以通过以下方式实现:

  • URL映射
  • 过滤器
  • 但我不认为在URL映射中加入逻辑(检查是否存在具有给定id的有效存储)是个好主意,所以最好使用过滤器

    因此,url映射将如下所示:

    "/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={}。还可以查看文档,默认情况下哪些变量可用于过滤器(例如:参数、请求、响应等)。如果这仍然不清楚,我可以添加一个答案作为示例。但我希望这些文件是不言自明的,明白了。谢谢请把你最后的评论作为回答,我会接受的。