Q&A履歴から
(1)二重押下防止機能について、Open棟梁部品でどう実現されているか分かる資料はありますか?
こちら側でも同様の部品を設計しており、クライアント側、サーバ側の両方で二重押下チェックを行う想定です。
チェックの判定フラグを戻す方法についてアドバイスいただきたいと思っております。
→ 以下の様に実装しています。
(a)二重送信防止機能(クライアント側)は左記の「二重送信防止機能」に該当します。
クライアント側JavaScriptでreadyStateプロパティを確認します(詳細はブラウザによる)。
独自のチェックの判定フラグを使用した場合、
レスポンスがないケースで固まってしまうので、readyState プロパティを使用しています。
また、ブラウザによっては、二重送信を既定で行い難い実装になっているため、そのあたりは、
ブラウザによって実装を変えています(コード見てみると、readyStateを使っているのは、IE、Edgeだけですね)。
また、別の技術者は、タイマー(setTimeout)でフラグを戻せるようにするという実装をしていました
(が、仕様として良いか悪いかは判断つきませんが、それぐらいしか選択肢も無いのも事実だと思います)。
(b)二重送信防止機能(サーバ側)は左記の「不正操作防止機能」に該当します。
GUIDのリクエスト・チケットをHiddenに入れてサーバでコンペアします。
なお、(a)はMVC、WebForms共通ですが、(b)はWebFormsのみの機能です。
また、複数ブラウザ・ウィンドウ対応する場合、リクエスト・チケットを、
ブラウザ・ウィンドウ・スコープのSessionに格納する必要があります。
(2)MVCでの対応策
クライアント側チェック、サーバ側チェックいずれにしても、
レスポンスがないケースで固まってしまう(フラグが戻らない)という問題がある。
今回ブラウザがIEに限られている為、対応策としては、
(x) readyState プロパティを使用する方法、
(y) タイマーでフラグを戻す方法、
が考えられると理解しました。
対応策(x)についてですが、WebForms版では、1回目のボタン押下でsubmitされた際に、
readyState プロパティが"complete"でなくなる為に、二重送信を防止できると理解しました。
このれはMVCでも使えるものですか?MVCでは対応策(y)ぐらいしかないのでしょうか。
→ readyState プロパティは、ブラウザ依存の仕組み
(IE、Edgeでのみ提供される)なので、MVCでも使用可能です。
---
・Webアプリケーションの不正操作 - Open 棟梁 Wiki
・二重送信防止機能 - Open 棟梁 Wiki
・不正操作防止機能 - Open 棟梁 Wiki