1

是否可以在控制器之间多次重定向响应?如果我尝试在控制器内重定向响应,然后在过滤器的 after 方法中进行重定向,我得到了这个异常:

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.

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

4

3 回答 3

8

在控制器之间多次重定向响应没有问题,但您只能在操作内重定向一次。检查您的操作方法并验证您在调用重定向后始终退出该方法(重定向并不意味着返回)。

这是错误的:

class MyController{

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

}

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

这是对的

类我的控制器{

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

}

注意使用闭包并返回内部闭包。闭包内的返回不会从主要操作中退出,而是从闭包 itef 中退出

这是错误的

class MyController{

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

    }

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

这是对的:

类我的控制器{

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

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

       redirect(uri:'/foo')
       }

    }
于 2012-12-06T08:26:41.660 回答
2

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

于 2012-12-06T08:17:47.010 回答
0

我有这个问题。利用

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

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

于 2014-04-01T18:58:06.293 回答