- PR -

sessionオブジェクトについて

1
投稿者投稿内容
Kira
ぬし
会議室デビュー日: 2004/10/30
投稿数: 252
投稿日時: 2004-11-11 23:17
質問があいまいでごめんなさい。
勉強中ですが、詳しくまだ分からないところがあって

1.
HttpServletRequest@
HttpSessionA
の違いというのは
@はページ間でしか有効ではない
Aはそのsessionが無効になるまで有効

なのでしょうか?

2.
sessionを無効化しないでおくとどんなデメリットがあるのでしょうか?
user
常連さん
会議室デビュー日: 2004/05/20
投稿数: 41
投稿日時: 2004-11-12 00:00
ちょっと長くなりますが、

javaAPIより引用
----request
javax.servlet.http
インタフェース HttpServletRequest
すべてのスーパーインタフェース:
ServletRequest
既知の実装クラスの一覧:
HttpServletRequestWrapper

public interface HttpServletRequest
extends ServletRequest
HTTP Servletのためのリクエスト情報を与えるために ServletRequestインタフェースを拡張します。

ServletコンテナはHttpServletRequest オブジェクトを生成し、Servletのサービスメソッド(doGet、 doPost等)に引数で渡します。

javax.servlet.http
インタフェース HttpSession

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

public interface HttpSession
複数ページにわたる要求により Web サイトの閲覧を行うユーザを一意に識別し、そのユーザについての情報を格納する方法を提供します。

-----session
サーブレットコンテナは、このインタフェースを使用して、HTTP クライアントと HTTP サーバ間にセッションを作成します。セッションは、ユーザからの複数の接続すなわちページ要求にまたがって一定期間持続します。通常 1 つのセッションはサイトに何度も接続する 1 人のユーザに対応します。サーバは、クッキーの使用や URL の書き換えなどといったさまざまな方法で、セッションを維持することができます。

このインタフェースによって、サーブレットは次のことを実行できます。

セッション識別子、生成時間、最終アクセス時間などのセッションについての情報を参照し、操作する
ユーザ情報が複数回のユーザ接続にわたって維持されるように、オブジェクトをセッションにバインドする


簡単に言いますと、HttpServletRequestはrequest(要求)に関している、
それに対して、HttpSessionというのはアクセスしている人を認識するため
のものです。

sessionを無効化しない場合とはsessionを閉じる(session.close())をしないという
ことでしょうか?sessionを閉じないとサーバーにアクセスのしたしている
という状態が増えることからサーバーがダウンする恐れがあるのです。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-12 00:34
>sessionを無効化しない場合とはsessionを閉じる(session.close())をしない
細かい話ですが invalidate() ですね。

set/getAttribute() メソッドによって情報を格納しておくという機能においてはYOUさんの認識の通りですね。砂くじらさんのおっしゃるとおりインターフェースは全く異なりますのでそれ以外の昨日については全然概念のことなるものです。

セッションに巨大なオブジェクトを放り込んでおいたりタイムアウト時間を長く設定しすぎたりすると OutOfMemoryError の原因となります。
セッションにセットするオブジェクトのサイズは大きくしすぎず(必要に応じて EntityBean の利用も!)、また想定される負荷をかけても十分にヒープが足りるように設計/設定しましょう。
Kira
ぬし
会議室デビュー日: 2004/10/30
投稿数: 252
投稿日時: 2004-11-12 22:40
すいません。
追加で教えていただきたいのですが、

1.
サーバ側で今どれくらいのセッションを保持しているかということを確認する方法は
あるのでしょうか?

2.
sesisonを作るとき以下のように作っていますが、
このページをリロードした場合また新しいセッションができるのでしょうか?
HttpSession session = request.getSession(true); // sessionオブジェクト
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-13 10:04
1.セッション数の確認方法について
依然はHttpSessionContext#getIds() で全てのセッションを取得できましたがServletAPI2.2以降では標準的な方法はありません。
コンテナによっては JMX インターフェースから取得可能です。
WebLogic Server では WebAppComponentRuntimeMBean#getOpenSessionCurrentCount() や管理コンソールから確認できます。
http://e-docs.bea.com/wls/docs81/javadocs/weblogic/management/runtime/WebAppComponentRuntimeMBean.html#getOpenSessionsCurrentCount()

2.セッションの作成タイミングについて
getSession()メソッドの説明を読みましょう。
http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServletRequest.html#getSession(boolean)
よくわからなければ簡単な実験で確認できますよね。
1

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