セッションIDの発行と受け渡し

今回は、セッションIDの発行とサーブレット間での受け渡しを行うサンプルサーブレットを作成していきます。

まずは、作成していくサーブレットの内容を下記します。

サーブレットを呼び出すためのフォームを作成します。

セッション管理サンプルサーブレット

「サーブレットの呼び出し」ボタンをクリックすると、サーブレット「SampleSessionCtl」を呼び出します。

サーブレット「SampleSessionCtl」では、セッションオブジェクトを生成し、生成されたセッションIDを表示するHTMLをレスポンスとして返します。

セッション管理サーブレットサンプル

「次のサーブレット呼び出し」をクリックすると、サーブレット「SampleSessionGetServlet」を呼び出します。

サーブレット「SampleSessionGetServlet」では、セッションIDを取得し、取得したセッションIDを表示するHTMLをレスポンスとして返します。

セッション管理サーブレットサンプル

セッションIDがサーブレットが変わっても同じ文字列であることが確認できます。

セッション生成メソッド一覧

セッションを生成するには、下記メソッドを使用します。

HttpSession getSession()
セッションを開始するメソッドです。セッション管理をはじめるにはHttpServletRequestオブジェクトのgetSession()メソッドを使用します。getSession()メソッドは、既にセッションが開始されているか開始されていないかに従い、引数であるboolean値の指定によって処理が異なります。

①getSession()とgetSession(true)の動作
まだセッションが開始されていないときは、新規に生成したHttpSessionオブジェクトを戻り値として返して、セッション管理を開始します。
既にセッションが開始されているときは、セッション管理の開始時に生成されたHttpSessionオブジェクトを戻り値として返します。

②getSession(false)の動作
まだセッションが開始されていないときは、新規にHttpSessionオブジェクトを生成せずにnullを戻り値として返します。

String getId()
セッションIDを取得します。

サンプルサーブレットのソースコード

以降に各サーブレットのソースコードを記載します。(冗長な部分は省略し、主要な部分のみ記載しています。)

まずは、サーブレット呼び出し用のフォームを作成します。フォーム(HTMLファイル)の詳細な作成方法はこちらを参照してください。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>セッション管理サーブレットサンプル</title>
</head>
<body>
<h1>セッション管理サーブレットサンプル</h1>
<form action="SampleSessionCtl" method="GET">
<input type="submit" value="サーブレットの呼び出し">
</form>
</body>
</html>

「サーブレットの呼び出し」ボタンをクリックした場合のアクションとして、SampleSessionCtlサーブレットを呼び出してします。その際のリクエストの種類には「GET」を指定しています。

SampleSessionCtlサーブレットのdoGet()メソッドには下記のように記述します。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    HttpSession session = request.getSession();

    out.println("<html>");
    out.println("<head>");
    out.println("<title>セッションの生成</title>");
    out.println("</head>");
    out.println("<body>");
    out.println("<h1>セッションの生成(ページ1)</h1>");
    out.println("<p>セッションIDは「" + session.getId() + "」です。</p>");
    out.println("<a href=\"SampleSessionGetServlet\">次のサーブレット呼び出し</a>");
    out.println("</body>");
    out.println("</html>");
}

getSession()メソッドでHttpSessionオブジェクト生成し、getId()メソッドで取得したセッションIDを出力しています。

「次のサーブレット呼び出し」のリンク先として、SampleSessionGetServletサーブレットを指定します。その場合のリクエストの種類は「GET」になります。また、注意点として、println()メソッドでダブルクォーテーショ(“)を出力したい場合は、「\」でエスケープしてやる必要があります。

SampleSessionGetServletサーブレットのdoGet()メソッドには下記のように記述します。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    HttpSession session = request.getSession();
    
    out.println("<html>");
    out.println("<head>");
    out.println("<title>セッションIDの取得</title>");
    out.println("</head>");
    out.println("<body>");
    out.println("<h1>セッションIDの取得(ページ2)</h1>");
    out.println("<p>セッションIDは「" + session.getId() + "」です。</p>");
    out.println("<a href=\"SampleSessionCtl\">前のサーブレットに戻る</a>");
    out.println("</body>");
    out.println("</html>");
}

ここでもgetSession()メソッドを呼び出していますが、今回は、既にセッションが開始されているので、セッション管理の開始時に生成されたHttpSessionオブジェクトが戻り値として返されます。そのため、getId()メソッドで取得するセッションIDは前のページで表示した文字列と同じになります。