在Grails中多次重定向响应

时间:2012-12-06 08:13:14

标签: grails redirect filter

是否可以在控制器之间多次重定向响应?如果我尝试在控制器内重定向响应,然后在Filter的方法之后我做了重定向,我得到了这个例外:

ERROR errors.GrailsExceptionResolver  - CannotRedirectException occurred when processing request: [GET] /ac/customer/index
Cannot issue a redirect(..) here. A previous call to redirect(..) has already redirected the response.. Stacktrace follows:
Message: Cannot issue a redirect(..) here. A previous call to redirect(..) has already redirected the response.

有没有其他方法可以解决这个问题?

3 个答案:

答案 0 :(得分:8)

在控制器之间多次重定向响应没有问题,但您可以在操作中仅重定向一次。检查操作方法并验证在调用重定向后总是退出方法(重定向不代表返回)。

这是错误的:

class MyController{

def myAction = {
   if(params.myparam){ redirect(uri:'/') }
   redirect(uri:'/foo')
   }

}

在此示例中,如果存在'myparam',则会在操作中发出两次重定向,这很糟糕。

这是正确的

class MyController {

def myAction = {
   if(params.myparam){ 
   return redirect(uri:'/') 
   }
   redirect(uri:'/foo')
   }

}

注意使用闭合并返回封闭内部。闭包内的返回不会从主动作退出,而是从闭包itsef

退出

这是错误的

class MyController{

    def myAction = {
       withForm {
          return redirect(uri:'/') 
       }.invalidToken {
          // bad request
       }
       redirect(uri:'/foo')
       }

    }

因为有效的两个重定向被调用。

这是正确的:

class MyController {

    def myAction = {
       def formIsValid
       withForm {
          formIsValid = true
       }.invalidToken {
          formIsValid = false
       }

       if(formIsValid){ 
         return redirect(uri:'/') 
       }

       redirect(uri:'/foo')
       }

    }

答案 1 :(得分:2)

您可以使用forward目的:将请求从一个控制器转发到下一个控制器而不发出HTTP重定向。grails docs中查看它。

答案 2 :(得分:0)

我有这个问题。使用

   chain(action:'', model:[pass any params here including any message]

以下是链的文档:http://grails.org/doc/2.3.x/ref/Controllers/chain.html