2011-12-30 11 views
0

標準のgrails環境では、クライアント接続が失われ、結果をもう配信できなくなっても、要求は常に最後まで実行されることに気付きました。クライアントへの接続が失われたときにリクエストを取り消す

クライアント接続が失われるとすぐにリクエストの実行がキャンセルされるように環境を設定する方法はありますか?

更新:回答のためのThanx。はい - 私は避けるようにしようとしています問題のほとんどは、より良いコード化することで回避することができます。

  • キャッシングは、ほぼすべてのページの高速
  • トークンが二回

何かを提出避けるために助けることができることができますが、依然として時間を消費する可能性のある要求があります。地図サービスを例にしましょう。ルートの計算には時間がかかります。要求を再送信しないようにする1つの解決策は、ユーザーへのメッセージと共に「calculateInProgress」フラグである可能性があります。しかし、その後も多くのセッションを作成し、DOS攻撃を行うために多くのリクエストを作成することは可能です。

私はまだ興味があります:要求をキャンセルするようにサーバーを設定する方法はありませんか?私は、サーバーがこのように振る舞い、それが素晴らしかったシステムで開発していました:-)

答えて

1

おそらくそういうことはありません。そして、私はそれが何かはフェーズ2の間に起こった場合、私の応答

を送信するサーバ側

  • に着信要求
  • プロセスを受け入れGrailsの(そして、あなたのWebコンテナ)が

    1. に設計されています確信していますレスポンスフェーズでのみそれについて知っています。実際にはあなた自身でHttpSerlvetResponeにデータを送信したり、IOExceptionを処理したりすることができますが、それはあまりにも低レベルの方法でしょう。また、送信するデータを準備している間は、DB操作をキャンセルすることには役立ちません。

      ところで、それは、nginxのように、ウェブのフロントエンドを使用するのが一般的なパターンの要求をincomming受け入れることとし、その他キャンセル要求、遅い要求(私はそれが本当の問題だと思う?)、とすべてこの問題

  • +0

    はい、遅い要求が本当の問題です。あなたがそれを助けるかもしれないと考えているので、いくつかの時間とページを何度もリロードしている患者を待っていると想像してください... – rdmueller

    +0

    これは、Nginxと適切なキャッシュ/エタグのヘッダーを使用して、サーバー側のキャッシュ(ehcache/memcache/etc) –

    1

    を扱いますあなたのコメントによると、それはあなたが避けようとしているリロードと複数のクリックです。適切な技術は、複数のフォームの送信を処理するためのGrailsのサポートを使用する必要があります:

    関連する問題