目次＞第3章 サンプルアプリケーション構築 > 3.5 セッション管理

# 3.5 セッション管理

## 1 概要

本節では、Server Frameworkが提供するセッション管理機能を用いて、セッションの登録および削除を行う方法を学習する。
セッション管理機能を用いると、セッションをライフサイクルレベルで管理することが可能となる。本機能の詳細は『WC-01 セッション管理機能』を参照のこと。
本節では、ログオンしたユーザのユーザIDをセッションで管理するアプリケーションを作成する。ユーザIDはライフサイクルレベル0で管理する。セッション管理は、Server Frameworkが提供するセッション管理クラス（SessionManagerクラス）を用いて行う。

### 1.1 ライフサイクルレベルとは

ライフサイクルレベルとは、セッション情報をグループ化する単位のことである。ライフサイクルレベルごとにセッション情報を管理することで、セッション情報のグループごとの一括削除を実現する。ライフサイクルレベル単位でセッションの削除を行うことで、セッションに登録した個別データの削除漏れを防ぐことができる。
ライフサイクルレベルは階層構造で管理されており、ライフサイクルレベル0はライフサイクルレベル1を包含し、ライフサイクルレベル1はライフサイクルレベル2を包含する。ライフサイクルレベルは、以降同様に包含関係を形成する。例えば、ライフサイクルレベル1を削除すると、ライフサイクルレベル2で保存されているオブジェクトも削除される。
図1.1-1 ライフサイクルレベルとは

### 1.2 動作イメージ

図1.2-1 動作イメージ

- 対象画面
  - ログオン画面（LogonForm.aspx）
  - メニュー画面（SelectItemForm.aspx）
- 処理概要
  1. （クライアント）ログオン画面で「ログオン」ボタンを押下する。
  2. （サーバ）認証に成功した場合、セッション管理機能を用いてライフサイクルレベル0のセッションにユーザIDを登録する。
  3. （クライアント）メニュー画面などマスターページを利用している画面を表示する。
  4. （サーバ）セッション管理機能を用いてセッションからユーザIDを取得し、ユーザIDを画面に反映（表示）する。
  5. （クライアント）マスターページのログアウトボタンを押下する。
  6. （サーバ）ログオン画面のLoadイベントでライフサイクルレベル0のセッションを削除する。

## 2 作業手順

- 作成イメージ
  1. ログオン画面のイベントの実装
  2. マスターページのイベントの実装

### 2.1 ログオン画面のイベントの実装

#### 2.1.1 OnInitメソッドの実装

セッションを扱う画面では、OnInitメソッドをオーバーライドしてセッション管理クラス（SessionManager）のインスタンスを生成する。

LogonForm.aspx.cs

    public partial class LogonForm : System.Web.UI.Page
    {
        /// <summary>
        /// セッション管理クラス。
        /// </summary>
        private SessionManager _sessionManager = null;

        /// <summary>
        /// 初期化メソッドをオーバーライドし、SessionManagerのインスタンスを生成する。
        /// </summary>
        /// <param name="e">イベントデータを格納している<see cref="EventArgs"/>。</param>
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            // セッション管理クラスの生成
            _sessionManager = new SessionManager(this.Session);
        }

        ・・・以下省略・・・

#### 2.1.2 Loadイベントの実装

Loadイベントに、ライフサイクルレベル0のセッションを削除するロジックを記述する。

LogonForm.aspx.cs

    /// <summary>
    /// セッション管理クラスの作成およびセッションの削除を行う。
    /// </summary>
    /// <param name="sender">イベントのソース。</param>
    /// <param name="e">イベントデータを格納している<see cref="EventArgs"/>。</param>
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            // ライフサイクルレベル0のセッションを削除する。
            _sessionManager.Remove(0);
        }
    }

Page_LoadメソッドでSessionManagerのRemoveメソッドを呼び出し、セッションの削除処理を実行する。Removeメソッドの引数には、削除対象のセッション情報が格納されたライフサイクルレベルを指定する。削除すべきユーザIDはライフサイクルレベル0に格納されているので、ここでは引数に「0」を指定する。
このように、Server Frameworkが提供するセッション管理機能を用いればライフサイクルレベルでのセッション情報の一括削除が容易となる。

#### 2.1.3 「ログオン」ボタンのクリックイベントの実装

3. ログオン画面のイベントの実装で追加した「ログオン」ボタンのクリックイベント内に、ライフサイクルレベル0のセッションにユーザIDを登録するロジックを追加する。

LogonForm.aspx.cs

    /// <summary>
    /// ログオン処理を行う。
    /// </summary>
    /// <param name="sender">イベントのソース。</param>
    /// <param name="e">イベントデータを格納している<see cref="EventArgs"/>。</param>
    protected void ButtonLogon_Click(object sender, EventArgs e)
    {
        // ユーザIDが"tera"、パスワードが"soluna"の場合、
        // ログオン成功とみなしメニュー画面への遷移を行う。
        if ("tera".Equals(TextBoxUserId.Text) && "soluna".Equals(TextBoxPassword.Text))
        {
            // セッション（ライフサイクルレベル0）にユーザIDを登録する
            _sessionManager.Add("UserId", TextBoxUserId.Text, 0);

            WebUtils.Transit("MenuForm");
        }
        else
        {
            // ログオンに失敗した場合、エラーメッセージを表示する
            LabelLogonError.Visible = true;
        }
    }

SessionManagerのAddメソッドを実行することで、ライフサイクルレベル0のセッションにユーザIDを登録する。 Addメソッドの第一引数にはセッションに登録するキー"UserId"を、第二引数にはセッションに登録する値、第三引数にはライフサイクルレベルを設定する。ユーザIDはライフサイクルレベル0で管理されるので、ここでは第三引数に「0」を指定する。

### 2.2 マスターページのイベントの実装

#### 2.2.1 OnInitメソッドの実装

1.1 OnInitメソッドの実装と同様に、セッションを扱う画面ではOnInitメソッドをオーバーライドしてセッション管理クラス（SessionManager）のインスタンスを生成する。

Tutorial.Master.cs

    /// <summary>
    /// マスターページ。
    /// </summary>
    public partial class Tutorial : System.Web.UI.MasterPage
    {
        /// <summary>
        /// セッション管理クラス。
        /// </summary>
        private SessionManager _sessionManager = null;

        /// <summary>
        /// 初期化メソッドをオーバーライドし、SessionManagerのインスタンスを生成する。
        /// </summary>
        /// <param name="e">イベントデータを格納している<see cref="EventArgs"/>。</param>
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            // セッション管理クラスの生成
            _sessionManager = new SessionManager(this.Session);
        }

        ・・・以下省略・・・
    }

#### 2.2.2 OnInitメソッドの実装

マスターページ（Tutorial.Master）のLoadイベントに、セッションからユーザIDを取得して、ラベルに反映するロジックを追加する。

Tutorial.aspx.cs

    /// <summary>
    /// ユーザIDをセッションから取得し、ラベルに反映する。
    /// </summary>
    /// <param name="sender">イベントのソース。</param>
    /// <param name="e">イベントデータを格納している<see cref="EventArgs"/>。</param>
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack){
            //ユーザIDをセッションから取得し、ラベルに反映する
            LabelUserId.Text = (string)_sessionManager["UserId"];
        }
    }

Page_LoadメソッドでSessionManagerのインデクサを用いてセッションからユーザIDを取得し、マスターぺージのラベルに反映する。インデクサのキーには、ユーザIDがセッションに登録されているキー"UserId"を指定する。セッションを取得する際にはライフサイクルレベルを指定する必要はない。

## 3 動作確認

### 3.1 セッションの登録および取得が正常に行われることの確認

1. サーバアプリケーションを起動する(TutorialServerWebプロジェクトの発行)。
2. ブラウザのアドレス欄のURLに「http://localhost/tutorialServerWeb/Form/LogonForm.aspx」を入力し、移動ボタンをクリックし、正常にログオン画面が表示されることを確認する。
3. ログオン画面でユーザID "tera"、パスワード "soluna" と入力し、ログオンボタンを押下する。
4. メニュー画面の左上部に「ようこそteraさん」と表示されることを確認する。

図3.1-1 セッションの登録および取得が正常に行われることの確認

メニュー画面に「tera」が表示されることで、ログオン画面のクリックイベントでセッションに登録されたユーザIDを、マスタページで取得できたことが確認できる。

### 3.2 セッションの削除が正常に行われることの確認

1. ログアウトボタンをクリックする
2. ログオン画面に戻ったことを確認する。
3. ブラウザのアドレス欄の「LogonForm.aspx」の部分を「MenuForm.aspx」に変更し、直接メニュー画面に遷移する
4. メニュー画面の左上部に「ようこそさん」と表示されることを確認する。

図3.2-1 セッションの削除が正常に行われることの確認

ログアウト後に直接遷移したメニュー画面の左上部の「ようこそ」と「さん」の間に何も文字が入っていないことで、ログオン画面のLoadイベントでライフサイクルレベル0のセッションが正常に削除されたことが確認できる。

次節：3.6 エラー画面遷移