是否可以在控制器之间多次重定向响应?如果我尝试在控制器内重定向响应,然后在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.
有没有其他方法可以解决这个问题?
答案 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