NOEMBLEM/エンブレムが設定されていません。

メールの詳細(トピック表示)

[session] リクエスト二重送信

投稿者:Kumiko Kawanoさん  2002/10/16 16:40  MLNo.862   [メール表示]

こんにちは、河野といいます。
この前は『frameで遷移先を指定』の質問に回答いただきました。
田名辺さん、ありがとうございました。

また、教えて頂きたいのですが、リクエスト二重送信についてです。
二重送信の防止については、『JavaScript』でSubmitを無効にする
方法がありますが、セッション管理で行う方法について検討しています。

レスポンスを返す前にリクエストが来たときに
下記のアクションクラス内でそのリクエストを無効に
するにはどの様にしたらいいのでしょうか?


public class UploadAction extends Action
{
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)

// 略

if(二重送信) {
// リクエストを無効にする処理
}


// 処理


// 正常処理の時のフォワード
return mapping.findForward("display");
}


よろしくお願い致します。


-------
E-Mail: kawano.kumiko@…


 読み込み中...

  • MLNo.865   "Y.Kawamoto"さん  (0) 2002/10/16 23:22  [メール表示する]
    川本@エアーです。

    >また、教えて頂きたいのですが、リクエスト二重送信についてです。
    >二重送信の防止については、『JavaScript』でSubmitを無効にする
    >方法がありますが、セッション管理で行う方法について検討しています。
    >
    >レスポンスを返す前にリクエストが来たときに
    >下記のアクションクラス内でそのリクエストを無効に
    >するにはどの様にしたらいいのでしょうか?

    元メールのようなやり方で実現するとしたら。

    リクエストを受けた瞬間にセッション情報の中に
    クライアントを特定できる情報と共に、
    そのクライアントから処理依頼を受けて処理中である
    ということを示すフラグでもセットして、
    処理中フラグが立っているリクエストがある間は
    別のリクエストが来たらそれは処理中のクライアント
    からかどうかチェックして、もしそうなら二重送信と
    みなす、とかいう処理が必要になります。

    ただし、クライアントがエスケープでキャンセルしても
    サーバ側で処理だけが続行していると、クライアントは
    それが終わるまでリクエストが発行できなかったり、
    処理中フラグデータの管理をどこかでやらなきゃならないとか
    面倒そうな気がします。

    これだと素直にJavaScriptで何とかしたほうが良さそうです。
    誰かもっと簡単にやれる方法をご存知でしょうか?

    *-----
    * Y.Kawamoto
    *-----

  • MLNo.866   prudenceさん  (0) 2002/10/16 23:50  [メール表示する]
    こんばんは、熊田といいます

    やったことは無いのですが、sessionオブジェクトに関して
    synchronizedする、というような方法ではできないのかな。

    すみません、ただの思いつきですが。

    > 川本@エアーです。
    >
    > >また、教えて頂きたいのですが、リクエスト二重送信についてです。
    > >二重送信の防止については、『JavaScript』でSubmitを無効にする
    > >方法がありますが、セッション管理で行う方法について検討しています。
    > >
    > >レスポンスを返す前にリクエストが来たときに
    > >下記のアクションクラス内でそのリクエストを無効に
    > >するにはどの様にしたらいいのでしょうか?
    >
    > 元メールのようなやり方で実現するとしたら。
    >
    > リクエストを受けた瞬間にセッション情報の中に
    > クライアントを特定できる情報と共に、
    > そのクライアントから処理依頼を受けて処理中である
    > ということを示すフラグでもセットして、
    > 処理中フラグが立っているリクエストがある間は
    > 別のリクエストが来たらそれは処理中のクライアント
    > からかどうかチェックして、もしそうなら二重送信と
    > みなす、とかいう処理が必要になります。
    >
    > ただし、クライアントがエスケープでキャンセルしても
    > サーバ側で処理だけが続行していると、クライアントは
    > それが終わるまでリクエストが発行できなかったり、
    > 処理中フラグデータの管理をどこかでやらなきゃならないとか
    > 面倒そうな気がします。
    >
    > これだと素直にJavaScriptで何とかしたほうが良さそうです。
    > 誰かもっと簡単にやれる方法をご存知でしょうか?
    >
    > *-----
    > * Y.Kawamoto
    > *-----
    >
    >


  • MLNo.867   muimyさん  (0) 2002/10/16 23:57  [メール表示する]
    宮本です。

    Strutsの同期トークンという仕組みが使えます。
    セッションにユニークなトークンIDを保存して、
    次のリクエストで保存したトークンIDとリクエストに渡されたトークンID
    を比較する仕組みです(この処理はStrutsフレームワークで用意されています)。

    やり方は、こんな感じだと思います。

    1.JSPを呼ぶ前のActionクラスで、トークンを設定します。
    Action#saveToken(request)

    2.JSPでtransaction指定をします。
    hoge

    ※ここで出力されたJSPのHTMLソースを見るとトークンIDが振られているのがわ
    かります。

    3.呼ばれたActionでisTokenValidメソッドで、1度目の有効なリクエストかどう
    か判別できます。
     Action#isTokenValid(request)
     ここでfalseが帰った場合には処理を無効にすればいいと思います。


    ついでに、便乗質問させてください。

    今マニュアルをお見たところ、html:linkやhtml:rewriteにはtransaction属性が
    ありますが、html:formにはないようです。
    formでアクションを指定する場合は、どうやって同期トークンを設定すればよい
    のでしょうか?


  • MLNo.868   "Takehiko Arai"さん  (0) 2002/10/17 01:06  [メール表示する]
    荒井です。

    >今マニュアルをお見たところ、html:linkやhtml:rewriteにはtransaction属性が
    >ありますが、html:formにはないようです。
    >formでアクションを指定する場合は、どうやって同期トークンを設定すればよい
    >のでしょうか?

    sessionにトランザクショントークンが設定されていると、特に指定しなくても
    トランザクショントークンが hidden として埋め込まれます。

    FormTag.doStartTag():
    | // Add a transaction token (if present in our session)
    | HttpSession session = pageContext.getSession();
    | if (session != null) {
    | String token =
    | (String)
    session.getAttribute(Action.TRANSACTION_TOKEN_KEY);
    | if (token != null) {
    | results.append(" | results.append(Constants.TOKEN_KEY);
    | results.append("\" value=\"");
    | results.append(token);
    | results.append("\">");
    | }
    | }



  • MLNo.869   Kumiko Kawanoさん  (0) 2002/10/17 07:12  [メール表示する]
     皆様、お答えありがとうございます。河野です。


    "Y.Kawamoto" wrote:
    > 元メールのようなやり方で実現するとしたら。
    >
    > リクエストを受けた瞬間にセッション情報の中に
    > クライアントを特定できる情報と共に、
    > そのクライアントから処理依頼を受けて処理中である
    > ということを示すフラグでもセットして、
    > 処理中フラグが立っているリクエストがある間は
    > 別のリクエストが来たらそれは処理中のクライアント
    > からかどうかチェックして、もしそうなら二重送信と
    > みなす、とかいう処理が必要になります。

     私も現在の実装はセッションIDとフラグを見てチェックし、
    レスポンスが返ったら、フラグを無効にするという方法を
    取っています。


    muimi admin wrote:

    > Strutsの同期トークンという仕組みが使えます。
    > セッションにユニークなトークンIDを保存して、
    > 次のリクエストで保存したトークンIDとリクエストに渡されたトークンID
    > を比較する仕組みです(この処理はStrutsフレームワークで用意されています)。
    >
    > やり方は、こんな感じだと思います。
    >
    > 1.JSPを呼ぶ前のActionクラスで、トークンを設定します。
    > Action#saveToken(request)
    >
    > 2.JSPでtransaction指定をします。
    > hoge
    >
    > ※ここで出力されたJSPのHTMLソースを見るとトークンIDが振られているのがわ
    > かります。
    >
    > 3.呼ばれたActionでisTokenValidメソッドで、1度目の有効なリクエストかどう
    > か判別できます。
    >  Action#isTokenValid(request)
    >  ここでfalseが帰った場合には処理を無効にすればいいと思います。

     同じ方法は http://www.freeml.com/message/struts-user@…/0000522
    にも掲載されていますね(気にはなっていたのですが、この方法)。
    是非使用してみたいのですが、お聞きしたいのは無効な時の処理方法です。
    アクションクラスでフォワード先を戻りとして返さなければなりませんが、
    リクエストを無視する場合、フォワード先をどうしたらいいのかと。
    (特にエラーページなどは設けない)


    ------
    E-Mail: kawano.kumiko@…

  • MLNo.871   akiike hiroshiさん  (0) 2002/10/17 12:24  [メール表示する]
    こんにちは。秋池といいます。

    解決策ではありませんが、

     http://itpro.nikkeibp.co.jp/free/NOS/NEWS/20021015/2/

    日本IBMからStrutsの拡張ツールがリリースされるそうです。
    記事によれば、その中に「一時点で同一ブラウザからのリクエストを
    1つだけ」にする機能があるようです。
    ダウンロードできるのが10/21からなのと、Struts の対応バージョンが
    1.0.2というのがクリアできるかが問題ですが、
    ライセンスは大丈夫そうです。

    On Wed, 16 Oct 2002 16:40:45 +0900
    Kumiko Kawano wrote:

    > こんにちは、河野といいます。
    > この前は『frameで遷移先を指定』の質問に回答いただきました。
    > 田名辺さん、ありがとうございました。
    >
    > また、教えて頂きたいのですが、リクエスト二重送信についてです。
    > 二重送信の防止については、『JavaScript』でSubmitを無効にする
    > 方法がありますが、セッション管理で行う方法について検討しています。
    >
    > レスポンスを返す前にリクエストが来たときに
    > 下記のアクションクラス内でそのリクエストを無効に
    > するにはどの様にしたらいいのでしょうか?
    >
    >
    > public class UploadAction extends Action
    > {
    > public ActionForward execute(ActionMapping mapping,
    > ActionForm form,
    > HttpServletRequest request,
    > HttpServletResponse response)
    >
    > // 略
    >
    > if(二重送信) {
    > // リクエストを無効にする処理
    > }
    >
    >
    > // 処理
    >
    >
    > // 正常処理の時のフォワード
    > return mapping.findForward("display");
    > }
    >
    >
    > よろしくお願い致します。
    >
    >
    > -------
    > E-Mail: kawano.kumiko@…
    >
    > --[PR]------------------------------------------------------------------
    > 【 FreeMLからのお知らせ 】
    >   ・自分でもMLを運営してみたい! => 始めての方でも安心して作れます!
    >   ・参加したいMLが見つからない? => それなら作ってみよう!
    >  ▼ ここから簡単に作れるよ♪ ▼
    >    http://ad.freeml.com/cgi-bin/ad.cgi?id=buDxF
    > ------------------------------------------------------------------[PR]--
    > Global Media Online www.gmo.jp

    (有)シンプル・ソフトウェア 秋池 浩
    電話 03-5784-2851, FAX 03-5784-2852 hiroshi@…



  • MLNo.872   muimyさん  (0) 2002/10/17 13:10  [メール表示する]
    宮本です。

    荒井さん

    > sessionにトランザクショントークンが設定されていると、特に指定しなくても
    > トランザクショントークンが hidden として埋め込まれます。

    自動的にhiddenに埋め込まれるわけですね。
    どうもありがとうございます。


    河野さん

    >お聞きしたいのは無効な時の処理方法です。
    >アクションクラスでフォワード先を戻りとして返さなければなりませんが、
    >リクエストを無視する場合、フォワード先をどうしたらいいのかと。
    >(特にエラーページなどは設けない)

    試してませんが、一案として、
    Action#performの戻り値にnullを返せばフォワードは行われないので、
    処理を中断しnullをreturnするとか。

    普通どうするものでしょう?



    IBMからStrutsの拡張ツール面白そうですね。
    単にWASに乗るだけでなく、機能がついているのか。。。


  • MLNo.875   Tomo Terashiさん  (0) 2002/10/17 16:29  [メール表示する]
    こんにちは、寺島といいます。
    横からすいません。

    > 試してませんが、一案として、
    > Action#performの戻り値にnullを返せばフォワードは行われないので、
    > 処理を中断しnullをreturnするとか。
    >
    上記ですが1.1b1で以前に試したところブラウザが真っ白になって
    しまいました。

    ・サーバ側では最初のリクエストを有効としている
    ・ブラウザ側では後のリクエストからのレスポンスを待っている。
    ・フォワードされない=レスポンスがない。
    ・ブラウザは白紙になる。

    ということだろうと思い、二重送信エラーのページにフォワードす
    るようにして逃げたことがあります。

    ただ当然ですがこれでは最初のリクエストの結果をクライアントに
    返すことができません。

    Strutsを使用した場合、サーバ側はTokenにより二重送信に対する
    制御は可能ですがクライアントに最初のリクエストに対するレスポ
    ンスを受け取らせる方法というのはあるのでしょうか?

    ------------------------------------------------------------
    寺島 朋孝(terashi-info@…)
    ------------------------------------------------------------



メールへの返信はMLのメンバーしかできません。
【PR】ステキな日記掲示板で盛り上がろう携帯対応日記無料のブログかわいいブログ
ゼッタイ住みたい4LDK超!/SUUMO