1

コントローラー間で応答を何度もリダイレクトすることは可能ですか? コントローラー内で応答をリダイレクトしようとすると、フィルターのメソッドの後、リダイレクトを実行すると、次の例外が発生しました。

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

コントローラー間で応答を何度もリダイレクトしても問題はありませんが、アクション内でリダイレクトできるのは 1 回だけです。アクション メソッドを確認し、リダイレクトを呼び出した後に常にメソッドを終了することを確認します (リダイレクトはリターンを意味しません)。

これは間違っています:

class MyController{

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

}

この例では、「myparam」が存在する場合、アクション内でリダイレクトが 2 回発行されますが、これは悪いことです。

正解です

クラスMyController{

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

}

クロージャの使用に注意し、クロージャ内で戻ります。クロージャ内の return は、メイン アクションからではなく、クロージャ自体から終了します。

これは間違っています

class MyController{

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

    }

有効な 2 つのリダイレクトが呼び出されるためです。

正解です:

クラスMyController{

    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 に答える