2012-12-06 62 views
1

是否可以在控制器之間多次重定向響應?如果我嘗試篩選我做一個重定向,我得到這個異常的方法後重定向控制器內,然後響應:在Grails中多次重定向響應

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. 

有沒有解決這個任何其他方式?

回答

2

您可以使用forward目的:在不發出HTTP重定向的情況下,將請求從一個控制器轉發到下一個控制器。請看grails docs

8

在控制器之間多次重定向響應沒有問題,但是您只能在動作中重定向一次。檢查你的操作方法,並驗證你總是在調用重定向後退出方法(重定向並不意味着返回)。

這是錯誤的:

class MyController{ 

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

} 

在這個例子中,如果「myparam」存在重定向發出兩次行動中,這是不好的。

這是正確的

類{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') 
     } 

    } 

因爲一個有效的兩次重定向被調用。

這是正確的:

類{myController的

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

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

     redirect(uri:'/foo') 
     } 

    }