1

Grails アプリでフォーム送信の重複を処理しようとしています。だから私useToken="true"は自分のフォームに設定し、これがwithFormコントローラーでメソッドを使用しようとする方法です:

def myControllerAction {
    withForm {
       *my action's logic*
    }
}

ただし、最終的には次のようになりError 310 (net::ERR_TOO_MANY_REDIRECTS): There were too many redirects.ます。ブラウザで。したがって、私はそれを正しく使用していないと思います.Web上でメソッドを適切に使用する方法の例は見つかりませんでした.

これに関するヘルプは非常に役立ちます。よろしくお願いします。

4

2 に答える 2

2

あなたの例にはあまりありません。短い答えは、トークンが無効な場合にリダイレクトを引き起こすために何かをしなければならないということです。

Grails マニュアルには、その使用方法が示されています。

ロジックが行うのは、一意の値を持つ隠しフィールドを配置することだけです。その値はセッションに保存されるため、セッションが正しく機能している必要があります (クラスター環境でホストしている場合は、セッション アフィニティまたは共有セッションが必要です)。フォームが送信されると、その一意の値が検索され、既に送信されているかどうかが判断されます。

どこでも処理していないように見えるためinvalidToken、トークンが正しく保存または渡されておらず、ロジックがリダイレクトを引き起こしている状況に対処している可能性があります。getの代わりに を使用してリダイレクトしている場合post、リダイレクト ループが発生する可能性があります。(これにより、トークンが最初に正しく処理された場合でも、リダイレクト ループが発生する可能性があります。)

あなたのコードを見て、リダイレクトがどこから来ているのかを突き止めます。トークンが直接の原因ではありません。

于 2012-05-04T03:06:40.780 に答える
1

答えは質問にあります-「フォームの送信が重複しています」、サーバーに2つのリクエストが送信されているため、両方に対処する必要があります。

したがって、2 つの同一の要求がブラウザーからサーバーに送信されるため、アクションは 2 回呼び出されます。

最初のリクエストは成功し、「withForm」ブロックのコードを使用して、トークンがインクリメントされます。

2 番目のリクエストには最初のリクエストと同じトークンがまだ含まれていますが、サーバーはそのトークンを破棄したため、2 番目のリクエストは「invalidToken」ブロックのコードを使用するか、「invalidToken」ブロックを省略した場合はデフォルト ブロックを使用します。 .

重要な点の 1 つは、ブラウザーに表示される内容を決定するのは 2 番目の (悪い) 要求です。最初の要求の後に到着するため、悪い要求を処理する際に、ユーザーをインデックスにリダイレクトすることにしました。 、最初の要求によって作成および保存されたレコードを表示できるはずです。すなわち

     }.invalidToken 
 {
    println "myController: swallowing request with invalidToken (probably a double-click or due to using back button in browser.)"
    flash.invalidToken = " " // just enough to trigger the g:if in the index.gsp
    redirect action:"index", method:"GET"
 }

次に、index.gsp に次のメッセージを表示します。

<g:if test="${flash.invalidToken}">
<ul class="errors" role="alert">
<li>
    <g:message code="error.doubleclick" 
           default="oops, the item you are creating exists already (maybe you double-clicked on the 'Save' button ?).  Click on the item in the list below to continue working with that item."
/>
</li>
</ul>

これは問題なく動作し、カスタマイズする必要なく、任意のコントローラーと index.gsp に切り貼りできるほど一般的です。

于 2014-06-07T15:10:25.787 に答える