- PR -

フレームセットで、セッションを分ける方法について

1
投稿者投稿内容
groovy_inoue
会議室デビュー日: 2005/05/18
投稿数: 9
お住まい・勤務地: 東京都
投稿日時: 2005-06-30 14:02
はじめまして

セッションの話題について、過去記事を見たのですが、解決できずにいます。
どなたか、ご存知でありましたらご教授いただければ幸いです。

【動作環境】
IBM Z-Series Linux(Suse9.2)
IBM WebSphereApplicatonServer 5.1 for Z/OS
All FusionGen(CAのCASEツール/J2EE準拠)
Internet Explorer 6.0(WindowsXP SP2)

【要件】
1端末で複数の業務画面を開きたい。(同時に閲覧したい)
シーケンスとしては、ポータル→ログイン→メニュー→複数業務画面。

【現状】
ログインとメニューは、JSP+Servlet(Struts)で作成、業務画面はGenというツールで作成しています。
メニュー→複数業務画面起動には、javascript:window.open()でHTMLフレームセットを開き、開いたフレームセットの一部フレームの業務画面を呼び出す形としています。

【問題】
複数画面を起動した場合、セッションの共有により、画面の挙動がおかしくなります。
これは、起動した画面をGenという4GLで開発しているため、その仕様といわれました。
よって、起動側(メニューもしくは起動したフレーム管理ウインドウ)で制御(セッションを別にする)を行うしかなくなりました。

【施策】
この問題に対して、Genのコンサルタントの方よりアドバイスがありまして、
上記にも書きましたが、HTMLフレームセットのフレーム内に業務画面(JSP)を呼び出す形式にし、業務画面呼び出し前に、セッションを破棄するとそのフレームのみ別セッションとなるような実例があるという情報をいただきました。

メニュー(JSP)
 ↓(window.open())
フレームセット(JSP)
 ↓
フレーム(JSP)(※ここで、HttpSession.invalidate()を実施)
 ↓(JSP Foward)
業務画面(JSP)

【施策に対する問題】
これを実施してみましたが、業務画面を仮にJSPにしてセッション状態をトレースしたところ同一セッションIDとなり、破棄した時点で情報が消え引継ぎ不可となってしまいました。


【ご質問】
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=8667&forum=12
にあるように、基本的には、デフォルトでCookieでセッションが管理されているため、
1端末1セッション(window.open()で開いても1つ)となることはわかっているのですが、4GLのGenの仕様により分けざるを得ない状況です。

そこで、上記、フレームセットで別セッション管理を行う方法をご存知の方がいらっしゃいましたら、ご教授ください。

個人的には、この方法があるのであれば、裏技的で1端末1セッションの思想に反している無理やりな方法ではないかと、疑念を抱いています。。。。。。

groovy_inoue
会議室デビュー日: 2005/05/18
投稿数: 9
お住まい・勤務地: 東京都
投稿日時: 2005-06-30 15:37
自己回答です。

あまり関係ないかもしれませんが、参考までに、以下を記載しておきます。

http://www.geocities.jp/tkuchino/Asp/000071.htm
によると、ASPの情報ですが、メインのフレームでセッションを使用しないと子フレームの各セッションは別になるということで、やってみたところ、

確かに、IEのメインプロセス(IEを起動後、フレームのURLを入力)での実施はセッションIDが分かれたのですが、window.open()で開く(親ウインドウがJSP)の場合には、ぜんぶ一緒になりました。

どこかで、セッションを新規作成しているためでしょうか????


以下、分かれたときのそれぞれの子フレームのJSPの中をトレースした結果です。
[05/06/30 15:20:03:922 JST] 0000007b SystemOut O topFrame#session.getId():swg-vO6AQBfAN4pf3_3-uR1
[05/06/30 15:20:03:922 JST] 0000007b SystemOut O topFrame#session.isNew():true
[05/06/30 15:20:03:953 JST] 00000043 SystemOut O leftFrame#session.getId():_zmGYkdoP4wfnNpemvNmqcZ
[05/06/30 15:20:03:953 JST] 00000043 SystemOut O leftFrame#session.isNew():true
[05/06/30 15:20:03:969 JST] 00000035 SystemOut O contentFrame#session.getId():wOLghVW-4iF3iLGCvH8Ks_I
[05/06/30 15:20:03:969 JST] 00000035 SystemOut O contentFrame#session.isNew():true
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-06-30 16:12
HttpSessionはインターフェイスなので、HttpServletRequestWrapperを使用して、
独自のHttpSession実装クラスのインスタンスを返すようなつくりにしてみてはいかがでしょうか。

現状のセッションに対して画面ID単位(URLなど)で独自のセッションオブジェクトを結びつけ、
getSessionを行ったときに、URLで判断して結び付けられた独自セッションオブジェクトを
現状のセッションから返す。ってな感じです。

山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-06-30 17:29
>そこで、上記、フレームセットで別セッション管理を行う方法をご存知の方がいらっしゃいましたら、ご教授
>ください。
既に参照されているスレッドに書いてありますが、Cookie じゃなくて URLRewriting でセッション管理すれば良いのではないでしょうか。ただし、セッション毎にログインが必要になると思います。
groovy_inoue
会議室デビュー日: 2005/05/18
投稿数: 9
お住まい・勤務地: 東京都
投稿日時: 2005-07-01 15:54
両方々、お返事ありがとうございます。

URLRewriting も業務画面(ツール側)の実装が対応していれば、最終的に検討しようと考えていました。(この場合WASのセッション設定をいじる必要あり)
RequestWrapperを使用する場合は、ラッパーリクエストのgetSession()を業務画面(ツール側)で実装する必要があるとの理解でよいでしょうか?であれば、現状ではツール側ではそのような実装ができないとの認識です。

元の投稿で再度検証を実施しましたところ、フレームセットのJSP:Forward時にHttpSession.invalidate()を実施すると、結果セッションIDが一時的に変わりました。
と、喜んだのもつかの間、前のセッションが削除されて、新しくなっただけで、結局、Cookieでの管理のため、複数のセッションをクライアントに保持することができないみたいです?????
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-07-01 19:55
どこかでHttpServletRequestをフックできるポイントがあればいいですが、無理なんですね。
セッションはブラウザによりますが、IEの場合ではプロセス単位になります。
ルートになるウィンドウから起動した画面は全て同一プロセスになり、
IEのアイコンから起動などの場合は別プロセスになり、別セッションになります。
groovy_inoue
会議室デビュー日: 2005/05/18
投稿数: 9
お住まい・勤務地: 東京都
投稿日時: 2005-07-08 11:41
>【施策】
>この問題に対して、Genのコンサルタントの方よりアドバイスがありまして、
>上記にも書きましたが、HTMLフレームセットのフレーム内に業務画面(JSP)を呼び出す形式にし、業務画面呼び出し前に、セッションを破棄するとそのフレームのみ別セッションとなるような実例があるという情報をいただきました。

あれこれ試しましたが、現段階では、他プロジェクトでの実例はどうもガセネタみたいで、結局、当初疑念を抱いていたとおり、この件に関しては、無理という結論です。
よって、方針転換で、複数起動する場合は、IEを別起動することになりました。


1

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