Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

タグブラウザのセッションについて。

初めての投稿です。初心者ですがよろしくお願いします。

タグブラウザでのセッションスコープについてなのですが。
同じブラウザの中で2つ以上のタグを複数開いた時、サーブレットでは同じセッションとして判断されているようで思いどおりに動作せず困っています。。(ちなみに掲示板のような簡単なwebアプリケーションです)

どういう場面かというと。処理の流れを示します。

?.ブラウザの入力フォームから送信されたパラメータをgetParameter()で受け取り例えば確認用のページなどにそのパラメータ渡すためにセッションオブジェクトへ保存する。

?.確認用ページではセッションスコープからオブジェクトを取り出しその内容を表示する。

?.入力内容の訂正時は元のページへ戻るようにし、そのページでさらにセッションスコープからオブジェクトを取り出し value=" にセットし内容を訂正してもらう。
入力内容OKの時はサーブレット側でそのセッションスコープから入力内容のオブジェクトを取り出し、この時点でデータベースを更新する処理を実行する。

?.セッションの破棄。

という処理の流れをしています。

このとき、例えば「FireFoxとIE」や「複数のIE」を開いて動作を試すと何の問題もなく正常に動いていたのですが、FireFoxやLunascapeなどのブラウザで複数のタグを使用してテストをすると下記のような動作が生じます。

まず、1つ目のタグでフォームへ内容を書き込んで送信する。確認用のページには入力内容が表示されている。
この時点で2つ目のタグで新たにフォームに内容を書き込んで送信する。

すると1つ目に送信した内容が2つ目に送信した内容によって上書きされているらしく、1つ目のタグに切り替え確認用のページなどで「投稿OK」のボタンを押すと2つ目のタグで入力されたの内容がデータベースで更新されてしまいます。(ちなみにこの時点で2つ目タグの方で「投稿OK」などのボタンを押すとエラーになります。?でセッションオブジェクトを破棄しているから)

この不具合を解消できるいい方法はないでしょうか。まったくアイデアが出なくて困っています。
現在はタグブラウザの使用時に注意を促す形で使用を継続しています。
ちょっと長文になってしまいましたがなにかアドバイスをよろしくお願いいたします。

15

回答

89514

閲覧

15件の回答

評価

0

同一セッションによる多重アクセスの問題は頭を悩ませますね。

セッションにカウンターを設けてシーケンスチェックを行えばいいのかな。
万全にするためには十分な注意が必要でしょうね。

評価

0

レスポンスにシーケンスIDかランダムなIDを付加して、次のリクエストでセッションに保持しておいた値と比較する、というのが一般的じゃないですかね。

ところで、「タグブラウザ」なるものはありません。

評価

0

私もそれくらいしか手段はないだろうと思いますね

あまり自信がないので(以前にもあった)セッション関連の話では書くのを控えるようにしているけど、
IEとかでもCtrl-Nで開くと同様になったかと

>「FireFoxとIE」や「複数のIE」を開いて動作を試すと何の問題もなく正常に動いていたのですが
はCtrl-Nではなくという意味だろうと思うので


>ところで、「タグブラウザ」なるものはありません。
これらの言葉の出元(生まれた世界?)はよく判らないけど、近年業界からではなく一般の間で勝手に生まれた言葉とか多いような気もしたりするし、誰かが?間違ったまま広く?一般に広まってる言葉もあったりとか・・

合ってる言葉で書き始めてるのに行も変わらない一文で2度目に現れた以降、「タグブラウザ」って書いてるのなんて素敵!

評価

0

>保持しておいた値と比較する、というのが一般的じゃないですかね。
なるほど、リクエストの整合性が確実にかつミニマムの修正で保たれますね。
メモしとこう^^

評価

0

やはりトークンを使用するのが一般的でしょう。


×タグブラウザ
○タブブラウザ

評価

0

>やはりトークンを使用するのが一般的でしょう。
なるほど、Strutsだとそのようなソリューションが準備されているんですね。
まだまだ、勉強不だなー^^;
質問者じゃないけど勉強になりました。

評価

0

ぐぐりました。
なるほど、ランダムIDの標準実装ですか。これなら楽ですね。

評価

0

jspサーブレットです。

多数のご回答ありがとうございます。
なるほど・・・
色々な解決手段があるようですね・・・
ですが、初心者の僕にはちょっと難しいようで・・・

皆さんのご回答をもとにグーグルなどで色々調べているのですが、「これ」といったものがなかなか見つからない状態です。
今までなら大概の壁はグーグルなどで十分、事足りたのですが・・・

なにか、この種の問題(例えば「同一セッションによる多重アクセスの問題」とか ・・tamaさんの回答から引用)を明確に解説されているようなページとかはどこかにないのでしょうか。あるいは書籍とか・・・

色々JAVAなどに関する掲示板などを見回っているのですがなかなかこの種の質問をしている人もいないようです。
みんなこの種の問題にぶち当たらないのでしょうか・・・?
あるいは僕の検索の仕方に問題があるのかな・・・。

なんか検索の仕方やキーワード入力のヒントも合わせてご教授していただけるとありがたいです。

皆さん、多数のご回答、本当にありがとうございます。

評価

0

>なにか、この種の問題(例えば「同一セッションによる多重アクセスの問題」とか ・・tamaさんの回答から引用)を明確に解説されているようなページとかはどこかにないのでしょうか。あるいは書籍とか・・・
お礼は大事ですが、ふつう回答側は、それより回答がどんな役に立ったのかを、知りたいものです。
「ちょっと難しい」で流されて「他へ行きます」では、なんのために回答したんだろう、ということになります。

もう少し頑張ってみることをおすすめします。
他のところへ行っても、結局同じように「ちょっと難しいので他のページありませんか?」と言いそうな気がします。

Webアプリケーションを作っているのであれば、十分な回答だと思います。
とくに難しい実装を、要求してはいません。
どこが分からなかったのかを書いてみましょう。

評価

0

うちも運用で逃げていたくちで、これまで問題はありませんでした。
でもIE7の登場でこの問題が表面化するのではないかという予感はあります。

Strutsをお使いならば、Action#saveTokenとAction#isTokenValidで
解決できます。
参考:
http://muimi.com/j/jakarta/struts/struts5.html

実現手順は他にもあると思いますが、基本はmioさんの
2006-09-29 11:00のアイディアです。
Strutsでない場合このメソッドと同じような実装をすれば大丈夫です。

今回のjspサーブレットさんの例でいくと
もっと単純に解決できる方法もありますね。

>ブラウザの入力フォームから送信されたパラメータをgetParameter()で受け取り・・(略

このときにリクエスト内容をセッションオブジェクトに保存するまえに、そのセッションオブジェクトが存在していたら重複なので、エラーとする。


>入力内容の訂正時は元のページへ戻るようにし、・・(略

HTMLを出力し終わったら、セッションオブジェクトを破棄する。

>データベースを更新する処理を実行する。
セッションオブジェクトを破棄する。

つまりリクエスト内容の保持されているセッションオブジェクトをフラグ代わりにするというアイディアです。
だめかな?

評価

0

あう、のんびり休憩してたら^^;
>もう少し頑張ってみることをおすすめします。

そうですね、ランダムIDの実装は汎用的で便利なものですから、是非自分のものにしたほうが良いですね。

評価

0

ちなみに、私の作成したフレームワークでは

・トークン発行の是非
・トークンチェックの有無
・トークンスコープ

を設定できるようにしています。
業務フローありきの機能実装でしたが。

評価

0

実際のコードは見たことないですが(そういう意味ではあまり見かけないものでもあるのかなあ?)、
頭の中のイメージですけど

例えばクッキーが受け入れられているかどうかのチェックとかでは、予めクッキーを送っておいて、その確認のための次ページの呼び出しでそれを確認していたりするのでしょう
(そういう例がないのか探してみるのもひとつ
要求に完全に一致するものでないと求めているものではない・・というものではないです)

取り敢えずはクッキーを使って(セッションIDとか、クッキーを使っていたりするんだろうと思いますけど)というのは置いといて、

1.ページを表示するときにフォームデータの1項目として、リクエスト毎に一意となるIDのようなものを埋め込んでおく
同時にそれをセッション(リクエスト属性?)として記録しておく

2.そのページからリクエストを出すとその項目が送られてくる筈ですから、セッションに記録しておいたものと一致するかどうか確認する・・一致しなければ異常
(正常・・一致したら)同時にその記録しておいたものを破棄するか、続けて次ページのリクエストのためのレスポンスがあるなら、新たなID(なり)を割り振って、1を

流れとかイメージできるでしょうか
それをイメージできるかというところが、
# 要求に完全に一致するものでないと・・
にもあたるモノを作る上で大切なところだったりするだろうと思います

IEでCtrl-Nとかで新しいウィンドウを開いたときは、ブラウザのキャッシュを使っていたりして、ID(なり)が一致している可能性も考えられるだろうと思います
一応、どれかのページからリクエストを出すと、それによりID(なり)は変わっているでしょうから、他のページからのリクエストは排除できる仕組みになっているだろう・・
とは思いますが、立て続けにリクエストを出された場合に耐えられるかどうかは検討の余地があるかもですね

じっくりイメージを固めて考えてみるとかしてみるのがいいかと
その上での「こう思うんだけど・・」とかはいくらでも快く相談にも乗ってもらえるんではないかと

評価

0

aa

評価

0

aa

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。