- PR -

リクエストの2重送信を防止する方法

投稿者投稿内容
masa
常連さん
会議室デビュー日: 2003/01/14
投稿数: 37
投稿日時: 2003-02-26 14:03
JSP(登録フォーム)
↓入力
Servlet(登録処理)
↓RequestDispacther#forward で転送
JSP(登録完了ページ)

のような処理をしているのですが、
登録完了ページには転送元のURL(ServletのURL)が表示されるので、
ブラウザの更新ボタンを押すとリクエストがもう一度Servletに送信されて
2重登録されてしまいます。

sendRedirectを使うという手もあるのですが、
たとえば入力エラーを登録フォームに返送する際にSessionオブジェクトを
使う必要がでてきてしまいます。
forwardで転送するということを前提としてよい方法を御教授お願いいたします。

なお、サーブレットコンテナは tomcat 4.0.6 で、strutsなどのフレームワークは
使用していません。
アレク
ベテラン
会議室デビュー日: 2002/10/23
投稿数: 97
投稿日時: 2003-02-26 18:04
jerry さん、こんにちは。

登録成功時だけ sendRedirect して、
エラー時には、forward するというのじゃ駄目ですか?
アレク
ベテラン
会議室デビュー日: 2002/10/23
投稿数: 97
投稿日時: 2003-02-26 18:17
何度もすみません。(^_^;

実際にやったことはないので、うまくいくかどうかは分からないのですが、
JavaScript で URL を書き換えるというのはどうでしょうか?

以下の記述で、登録完了ページがロードされた時に
現在の URL を()内の URL に書き換えることが出来るはずです。

<BODY onLoad="window.location.replace('http://www.xxx.xxx/xxx.jsp')">

いいかげんな回答で申し訳ないですが、良かったら試してみてください。
masa
常連さん
会議室デビュー日: 2003/01/14
投稿数: 37
投稿日時: 2003-02-26 20:05
アレクさん 返信ありがとうございます。
javascript の方法早速試してみたのですが、どうもうまくいきません。
javascript に関しては無頓着なのですが、

<BODY onLoad="window.location.replace('http://www.xxx.xxx/xxx.jsp')">

に設定するURIは”http://”からはじめなくてはならないのでしょうか?
もしそうだとするとJSPにサーバ固有のアドレスを記述しなくてはならなくなりますよね?
移植性などを考慮するとそれはちょっと避けたいのですが、、、。
ちがってたらすみません。

ちなみに、
>>登録成功時だけ sendRedirect して、
>>エラー時には、forward するというのじゃ駄目ですか?
の方法はこれから試してみようと思っています。
アレク
ベテラン
会議室デビュー日: 2002/10/23
投稿数: 97
投稿日時: 2003-02-26 23:49
引用:

javascript の方法早速試してみたのですが、どうもうまくいきません。
javascript に関しては無頓着なのですが、

<BODY onLoad="window.location.replace('http://www.xxx.xxx/xxx.jsp')">

に設定するURIは”http://”からはじめなくてはならないのでしょうか?
もしそうだとするとJSPにサーバ固有のアドレスを記述しなくてはならなくなりますよね?
移植性などを考慮するとそれはちょっと避けたいのですが、、、。



申し訳ないです。

私も実際に JavaScript で試してみましたが、駄目ですね・・・。
URL 以前の問題でした。

ということで、今のところは sendRedirect と forward を
使い分けるのがよいかと思います。

たいして力になれず、申し訳ありません。
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2003-02-27 09:41
JavaScriptでもできますよ。

送信ボタンのonClickで最初のクリックか2回目以降か調べられます。

下記のコードがサンプルです。
コード:
・・・

  <SCRIPT type="text/javascript">
  <!--
  var isFristTime = true;

  function processSubmit() {
    if(!isFristTime) {
      return;
    } else {
      firsttime = true;
      window.document.forms["FORM"].action = "http://....";
      window.document.forms["FORM"].submit();
    }
  }

  // -->
  </SCRIPT>

・・・

<BODY>
<FORM name="FORM" method="post">
  T1:<input type="text" name="T1"><BR>
  T2:<input type="text" name="T2"><BR>
  <input type="button" value="submit" onclick="processSubmit()">
</FORM>
</BODY>

・・・

H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2003-02-27 09:44
上記のファンクションが間違っていました。
正しくは

コード:
function processSubmit() {
  if(!isFristTime) {
    return;
  } else {
    firsttime = false;
    window.document.forms["FORM"].action = "http://....";
    window.document.forms["FORM"].submit();
  }
}


です。
masa
常連さん
会議室デビュー日: 2003/01/14
投稿数: 37
投稿日時: 2003-02-27 15:53
>>たいして力になれず、申し訳ありません。
アレクさん、そんなことありません。
失敗したらforward、成功したらSendRedirectというのはうまくいきそうな気がします。
まだ実装していないのですが、実装したら報告しますね。

H2さん

>>window.document.forms["FORM"].action = "http://....";

の部分はやはりプロトコル名から記述しないと動かないでしょうか?
コンテキストパスからの指定ですとうまくいかないようです。

スキルアップ/キャリアアップ(JOB@IT)