- PR -

Webアプリの二重送信対応

投稿者投稿内容
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2004-05-28 21:43
そのオブジェクトからセッションIDという文字列が取れるメソッドがありますのでそいつの戻す文字列のintern()で同期化してください。
カヌー
会議室デビュー日: 2003/01/14
投稿数: 19
投稿日時: 2004-05-31 14:42
お疲れ様です。

引用:

コード:
java.util.ConcurrentModificationException




は、Enumerationの繰返し処理中にそのEnumerationの取得もとのオブジェクトを変更したりすると発生します。
ので、
引用:

コード:
while(sessionEnu.hasMoreElements()){ 
String name = (String) sessionEnu.nextElement(); 
session.setAttribute(name + "_s_b", session.getAttribute(name)); 
} 




コード:
session.setAttribute()

をwhile文の外で行えば、
ConcurrentModificationExceptionの発生は止められると思います。

個人的にもこの問題に興味があるので、よろしければその後の状況なども教えていただけると幸いです。
顔爺
ベテラン
会議室デビュー日: 2003/10/03
投稿数: 52
投稿日時: 2004-05-31 15:24
去年の記事ですが、Protect Web application control flow というのがあります。

http://www.javaworld.com/javaworld/javatips/jw-javatip136.html

試したことはありませんが、問題なさそうに見えます。

# 追記
訂正。HttpSession の同期は必要ないか、気になります。


[ メッセージ編集済み 編集者: 顔爺 編集日時 2004-05-31 16:11 ]
sinh
ベテラン
会議室デビュー日: 2003/01/22
投稿数: 87
投稿日時: 2004-06-02 21:23
返信が遅くなって申し訳ないです。

Anthyhimeさん:引用--------------------------------------------------------------
そのオブジェクトからセッションIDという文字列が取れるメソッドがありますのでそいつの戻す文字列のintern()で同期化してください。
--------------------------------------------------------------------------------

session.getId().intern()を使用して同期を取りましたが、
それでもjava.util.ConcurrentModificationException が発生します。


カヌーさん:引用-----------------------------------------------------------------

引用:
-----------------------------------------------------------------------------


コード:
-----------------------------------------------------------------------------

java.util.ConcurrentModificationException

-----------------------------------------------------------------------------



-----------------------------------------------------------------------------


は、Enumerationの繰返し処理中にそのEnumerationの取得もとのオブジェクトを変更したりすると発生します。
ので、
引用:
-----------------------------------------------------------------------------


コード:
-----------------------------------------------------------------------------

while(sessionEnu.hasMoreElements()){
String name = (String) sessionEnu.nextElement();
session.setAttribute(name + "_s_b", session.getAttribute(name));
}


-----------------------------------------------------------------------------



-----------------------------------------------------------------------------


のコード:
-----------------------------------------------------------------------------

session.setAttribute()

-----------------------------------------------------------------------------

をwhile文の外で行えば、
ConcurrentModificationExceptionの発生は止められると思います。
--------------------------------------------------------------------------------

そうなのですか。ちゃんとJavadocを読むべきでした。
試してみたいと思います。

顔爺さん:引用-------------------------------------------------------------------
去年の記事ですが、Protect Web application control flow というのがあります。

http://www.javaworld.com/javaworld/javatips/jw-javatip136.html
--------------------------------------------------------------------------------
記事をみたのですが、行っている処理は同じようなものなので、問題ないと
思います。
sinh
ベテラン
会議室デビュー日: 2003/01/22
投稿数: 87
投稿日時: 2004-06-03 18:18
Enumerationの繰返し処理中にそのEnumerationの取得元のオブジェクトを変更しないようにして、java.util.ConcurrentModificationException の例外は
発生しないようになりました。
しかし、今度はTomcatを起動したときに表示されるコマンドプロンプト画面に、
    致命的:Error finishing response
java.lang.ArrayIndexOutOfBoundsException: 32005
と表示され、原因は不明です。
やはり、2重送信対応は無理なのでしょうか?


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