- PR -

セションタイムアウト時に。

投稿者投稿内容
たろー
会議室デビュー日: 2004/12/21
投稿数: 11
投稿日時: 2004-12-26 16:51
いつもお世話になっております。
strusを適用してサンプルアプリ作成中/検証中です。

web.xmlにて、セションタイムアウトを設定し、HttpSessionListenerクラスでセションが切断されるのを確認しております。

ある画面を放置して、タイムアウト後にあるボタンを押下し、エラー画面へ遷移させいます。そこで、タイムアウト後にセションが切断され、あるボタン押下後にセションが自動的に生成されているを確認しています。
セションが一旦切断されたのに、ボタン押下後に新規のセションが自動的に生成されるのに疑問を持ちます。サーブレットコンテナ内、またはstruts内で、request.getSession(true);が実行されているのでしょうか??
(セションが一旦切断されたのだから、nullが返ってくると推測していたのですが。)

また、request.getSession();の戻り値がnullになることってあるのでしょうか??
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-12-26 17:19
コンテナで自動的にセッションを生成してしまうことはないでしょう。(JSPでは暗黙的に作られますが)。
切り分けたければ Struts をつかわないアプリケーションで同様のことが発生するか確認してみてはいかがでしょうか。
また、Struts のソースを調べてみてもいいですね。せっかくのオープンソース製品ですから。
ActionForm のスコープに session を指定できることなどから必ずどこかでセッションを取得しているのは確かですが。
YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2004-12-26 17:45
HttpSessionListener#sessionCreated()でどのタイミングでセッションが
生成されているかを調査できないでしょうか。

同メソッドで、
new Exception().printStackTrace();
のようなコードを入れてスタックトレースを表示させてみるとか。。。
たろー
会議室デビュー日: 2004/12/21
投稿数: 11
投稿日時: 2004-12-27 01:48
インギさんへ
さしあたり、Strutsのソースを"getSession"の文字列で調べたところ、"getSession()"、"getSession(false)"しかなく、"getSession(true)"が存在していませんでした。

YOU@ITさんへ
HttpSessionListener#sessionCreated()をインプリメントしたクラスで(new Exception()).printStackTrace()を実行し、Ecripseのコンソールに出力された内容です。
---------------------------------
java.lang.Exception
at サンプルアプリで発生した行数です。
at org.apache.catalina.session.StandardSession.tellNew(StandardSession.java:418)
at org.apache.catalina.session.StandardSession.setId(StandardSession.java:390)
at org.apache.catalina.session.ManagerBase.createSession(ManagerBase.java:741)
at org.apache.catalina.session.StandardManager.createSession(StandardManager.java:360)
at org.apache.coyote.tomcat5.CoyoteRequest.doGetSession(CoyoteRequest.java:2285)
at org.apache.coyote.tomcat5.CoyoteRequest.getSession(CoyoteRequest.java:2127)
at org.apache.coyote.tomcat5.CoyoteRequestFacade.getSession(CoyoteRequestFacade.java:549)
at org.apache.coyote.tomcat5.CoyoteRequestFacade.getSession(CoyoteRequestFacade.java:554)
at org.apache.struts.action.RequestProcessor.processLocale(RequestProcessor.java:602)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:179)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:415)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:284)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:204)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:257)
以下、省略。
---------------------------------
上のスタックとレースより(RequestProcessor.java:602)付近を調べると、以下の記述がされています。
HttpSession session = request.getSession();
if (session.getAttribute(Globals.LOCALE_KEY) != null) {
return;
}
推測ですが、Strutsでセションを新規に生成することはないように見えます。

Strutsを使わないアプリケーションで試してみます。
ちなみにStruts1.2.4、Tomcat5.0.19、eclipse3.0でサンプルを作成しています。
YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2004-12-27 01:56
引用:

たろーさんの書き込み (2004-12-27 01:48) より:
上のスタックとレースより(RequestProcessor.java:602)付近を調べると、以下の記述がされています。
HttpSession session = request.getSession();
if (session.getAttribute(Globals.LOCALE_KEY) != null) {
return;
}
推測ですが、Strutsでセションを新規に生成することはないように見えます。


HttpServletRequest#getSession()では、セッションがなければ新規作成するのではなかったでしょうか?
私も今のStrutsには詳しくないのですが、この部分でStruts内でセッションが作成されているのではないでしょうか?

山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-12-27 03:15
Strutsで作っているみたいですね。
http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/http/HttpServletRequest.html#getSession()
たろー
会議室デビュー日: 2004/12/21
投稿数: 11
投稿日時: 2004-12-27 17:46
おつかれさまです。

すみません。
request.getSession()はセションがなかったら新規に生成するメソッドですね。

通常のサーブレットでセションの状態を観察しました。
タイムアウト時はセションが切れたままで、新規にセションが生成されるようなことはありませんでした。

ただ、ボタン押下時にサーブレット内で意図的にセションを切断した場合、『一旦セションが切断⇒新規にセションが生成される』という動きを見せました。
具体的なロジックは以下の通りです。

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
System.out.println("★★★★テスト実施スタート");
HttpSession session = request.getSession();
// セションを明示的に切断
session.invalidate();

// 遷移する??
RequestDispatcher rd = request.getRequestDispatcher("/jsp/index2.jsp");
rd.forward(request, response);
System.out.println("★★★★テスト実施終わり");

}

セションをinvalidateしたのにも関わらずディスパッチできるんですね。
(「リクエストに関連付けられている」セションなのでセションを削除してもリクエストも削除されるというわけではない。動きを保障してセションは保障されない、という考え方なんでしょうか。。。)

そう考えると、Strutsも同様というか、通常のサーブレットの動きと考えても良いのでしょうか。。。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-12-27 18:05
HTTP のソケットレベルでのセッションと Java の HttpSession を混同されていないでしょうか?
HttpSession を invalidate してもソケットはクローズされませんので普通にレスポンスを返せますよ。
逆に HttpSession が生成されていなくてもレスポンスを返せるわけだし・・・ね?

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