プログラミング逆引き辞典

~ 多言語対応のプログラミングレシピ ~

【詳解】セッションスコープ

セッションスコープの仕組みと注意点を解説する

セッションスコープスコープの基本はこちら→セッションスコープ(基本編)
 
 

【セッションIDとは】

セッションスコープのインスタンスを作成する為「getSession()」メソッドを実行する
その際にセッションIDが発行される
このセッションIDはブラウザセッションスコープのインスタンスに設定される
ブラウザからリクエストが送信されるとサーバーはクッキーによってセッションIDからセッションスコープのインスタンスを特定してブラウザにレスポンスする
 
 


【クッキーとは】

サーバーがブラウザにデータを保存、送信させる仕組み
 
 


【クッキーのながれ】

①ブラウザがセッションIDを含めてリクエスト
②サーバーがセッションIDに応じたセッションスコープのインスタンスを取得
③サーバーがクッキー情報を含めてブラウザにレスポンス
④ブラウザがコンピューターにクッキーを保存
⑤ブラウザのリクエストにクッキー情報を含めてサーバーに送信
※基本的にセッションIDの有効期限はブラウザを閉じるまでだが、設定等によっては変更が可能
 
 


【セッションタイムアウトとは】

セッションは基本的にブラウザを閉じるまでが有効期限となっている
その為、同一ブラウザで別タブを開いて別作業をしてもセッションスコープのインスタンスは残ったままとなる(ガベージコレクションされない)
またインスタンスが残っているということはメモリを使用している状態なので、多用するとメモリ不足の原因になってしまう
そのメモリ不足を防ぐ為に一定時間利用されていない場合はガベージコレクションの対象に含める
この動作をセッションタイムアウトという
※Apache Tomcatの場合はデフォルトで30分に設定されている
 
 


【セッションスコープのインスタンス削除】

【基本構文】

session.removeAttribute("属性名");

 
 


【セッションスコープ自体の削除】※ログアウト時などで使用

【基本構文】

session.invalidate();

 
 


【セッションIDの確認】

実際にフォーム画面で入力したユーザー名とセッションスコープとブラウザにセットされたセッションIDを確認
 
・Beans.Java:JavaBeansクラス

package sample;

import java.io.Serializable;

public class Beans implements Serializable {
    private String userName;
    private String sessionId;

    //JavaBeansのルールである引数を持たないコンストラクタを定義
    public Beans() {

    }

    //ユーザー名とセッションIDを引数に持つコンストラクタ
    public Beans(String userName, String sessionId) {
        this.userName = userName;
        this.sessionId = sessionId;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public void setSessionId(String sessionId) {
        this.sessionId = sessionId;
    }

    public String getUserName() {
        return userName;
    }

    public String getSessionId() {
        return sessionId;
    }
}

 
・MainController.Java:サーブレットクラス

package sample;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class MainController
 */
@WebServlet("/MainController")
public class MainController extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public MainController() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //login.jspに遷移
        RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/login.jsp");
        dispatcher.forward(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //login.jspで入力されたパラメーターがエンコードされている為、デコード
        request.setCharacterEncoding("UTF-8");

        //セッションのインスタンス
        HttpSession session = request.getSession();

        //login.jspで入力されたユーザー名
        String userName = request.getParameter("userName");
        //セッションID
        String sessionId = session.getId();

        //Beansクラスの引数を持つコンストラクタでユーザー名とセッションIDをセット
        Beans beans = new Beans(userName, sessionId);
        //セッションスコープのインスタンスに保存
        session.setAttribute("beans", beans);

        //result.jspに遷移
        RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/result.jsp");
        dispatcher.forward(request, response);
    }
}

 
・login.jsp:ログイン画面(ユーザー名を入力、送信するフォーム)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ログイン画面</title>
</head>
<body>
    <h1>ログイン画面</h1>
    <form action="/SessionTest/MainController" method="POST">
        <p>ユーザー名:<input type="text" name="userName"></p>
        <p><input type="submit" value="送信"></p>
    </form>
</body>
</html>

 
・result.jsp:セッション確認画面(ユーザー名とセッションIDを確認)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>セッション確認画面</title>
</head>
<body>
    <p><c:out value="${beans.userName}" /></p>
    <p><c:out value="${beans.sessionId}" /></p>
</body>
</html>

 
・Eclipseのフォルダ構成 ※JSTLを使用している為「lib」フォルダにJARファイルを配置している
JSTLの解説についてはこちら→【詳解】JSTL

 
・サーバーを起動

 
・ブラウザを起動後、下記URIを入力し、送信ボタンを押下するとユーザー名とセッションIDが表示されるので、「同一ブラウザの別タブ」「別ブラウザ」等でセッションIDを確認できる

http://localhost:8080/SessionTest/MainController

 
 
・まずは単一ブラウザに表示

 

 
・同一ブラウザの別タブ⇒同一ブラウザの為、セッションIDは同じ

 

 
・別ブラウザ ※さきほどまでのブラウザは閉じてセッションを切っておく⇒セッションIDは異なる