- PR -

セッション変数の操作方法について

1
投稿者投稿内容
くろちゃん
会議室デビュー日: 2008/02/06
投稿数: 10
投稿日時: 2008-05-15 22:53
サーブレット(もしくは、それと同等なもの)内でsessionに格納している変数の参照を取り出して書き換える場合、
同一セッションを利用している複数のリクエスト内ではスレッドセーフではないですよね、、

皆さんはどのようにこの問題を回避しておられますか?
私は
1.セッションには常にイミュータブルなオブジェクトをnewして入れるというルールにするか、
2.必要な変数は、ある時点でセッションから別のライフサイクルレベルにコピーし、再度セッションに格納する
しか思いつかないのですが、ほかにいい方法があれば教えてください。

(ちなみに1の方法だとイミュータブルであることという制約を設けるのも難しいとは思うのですが、、)
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-05-15 23:31
自分の場合はセッションスコープにあれこれ突っ込まないですね。
大体イミュータブルなログイン情報くらいです。

極力セッションに頼らないつくりにすると、
スケーラビリティがアップするというか、スケールアウトしやすくなるので、
その辺を意識して作るようにしています。

なので、マルチスレッドで云々とかはあまり気にしないですね。
くろちゃん
会議室デビュー日: 2008/02/06
投稿数: 10
投稿日時: 2008-05-15 23:58
引用:

かつのりさんの書き込み (2008-05-15 23:31) より:
自分の場合はセッションスコープにあれこれ突っ込まないですね。
大体イミュータブルなログイン情報くらいです。



返信ありがとうございます。

実は、、クライアント側もJavaなフレームワークを作ろうとしています。
確かにログイン情報くらいしかセッションに登録する必要がないのですが、
その情報もフレームワークを利用するアプリごとに若干違うと思いますので、アプリごとに拡張する必要性がでてしまうと思います。。

アプリ側でセッションを自由に操作するというルールであれば、単にそちらで注意すればいいのですが、
利用者にスレッドセーフの問題や、回避方法を意識させなくてもいいようにする方法があればそれもいいかなぁと思っています。
アプリごとに拡張するとイミュータブルであることを制限できるとは言い切れないですし、、
そんな感じで悩んでいます--;

(実際にやりたいことと最初の質問の内容は、若干違うのです・・・すみません)
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2008-05-16 12:57
私もセッションにはあまりモノを突っ込まないですね。
一応、HttpSessionを直接操作するのではなく、セッション操作を
特定のクラスに集中させておくようにはしています。

動的なデータを突っ込む必要が出る箇所というのは、何らかの複雑な
プログラムが要される場所なので、そこは「誰にでも使いやすいライブラリ」
である必要はなく、一定レベル以上の技能を持った人が注意深く扱え、
という方針でもまず困ることはないですね。

裏でThreadを起こして処理をするような機能性を作った時は、
セッションに該当Threadを管理するようなオブジェクトを保持させましたが
そこの部分はやはりスレッドセーフを意識して使わざるを得ませんでした。
ただし、そうした情報が明確に切り分けて管理されてさえいれば、
よくわからない人が手を出してシステム全体を破壊することにはならない。

セッションキーを自在に使えるような運用ルールだと混乱が起こりやすいですから
やはり、冒頭述べたようにセッション操作は特定のクラスに集中させるのがよい。
悪さをする人がいないかを網羅的に検出したいならHttpSessionの操作を制限する
Proxyクラスでもかませておくなり、管理の仕方はありますから。
くろちゃん
会議室デビュー日: 2008/02/06
投稿数: 10
投稿日時: 2008-05-16 23:17
返信ありがとうございます。

やはり注意するしかないですかね^^;
セッションを直接操作できなくしても、
変数の参照を触れればgetしたもののプロパティの一部をsetできて意味ないですし

Proxyクラスでというのは動的に制限するということでしょうか
参考にさせていただきます。
1

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