6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

JavaのServletのセッション(session)管理

Posted at

セッション(session)とは

sessionとは、複数のユーザがアクセスするWebアプリケーションで、各ユーザの状態の保存・ユーザの区別を行う機能で、ユーザの識別はセッションIDを使って行う。
複数のリクエスト・レスポンスにまたがってユーザーの識別データの管理をする仕組み
簡単に言うと、ログインからログアウトまでの情報を保持する機能。

セッションはクライアント毎に作成され、セッションが開始されるとセッションを識別するためのセッションIDをクライアントの保存し、また保存したい値をセッション変数としてサーバ側に保存する。クライアントに保存されるセッションIDはクッキー(Webページの利用履歴や入力情報などをテキストデータとしてWebブラウザに保存する仕組み)を利用して保存される。

ユーザーの識別とデータの管理

サーバー側(Servlet)でユーザーの識別とデータの管理をするには"doGet"メソッドや"doPost"メソッドの引数で渡されてくる「HttpServletRequest」インターフェースのオブジェクトであるセッションオブジェクトを生成する

// セッションオブジェクトの生成
HttpSession session = request.getSession();

getSessionメソッドは、サーブレットを要求してきたクライアントに対してセッションが既に開始されていればそのセッションを返す。また引数に"ture"を指定した場合にはセッションが開始されていなければ新規にセッションを開始した後でそのセッションを返し、"false"を指定した場合は、セッションが存在しない場合にはnullを返す。
またクライアントに対してセッションを取得する事も出来る

セッションを使ってデータの格納や取得、削除などを行うときは基本的に次のようなコードを記述する。

セッションオブジェクトに値(データ)を格納
session.setAttribute("属性名(key)","値(value)")
セッションオブジェクトに格納されている値(データ)の取得
session.getAttribute("属性名(key)")
セッションに格納されている値の削除
session.removeAttribute("属性名(key)")
セッションを破棄する(ログアウトする)
session.invalidate();

*セッションオブジェクトに格納するデータはObject型として使うのでキャストが必要になる場合がある

Strig name = (Strig)session.getAttribute("name")

スクリーンショット 2023-01-07 11.25.10.png

サンプルコード

サンプル
import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

@WebServlet("/session")
public class SessionServlet extends HttpServlet {
  public void doPost(HttpServletRequest req, HttpServletResponse res)
      throws IOException, ServletException {
    // セッションオブジェクトの生成or取得
    HttpSession session = req.getSession(true);
    // セッションオブジェクトからcartを取得
    ArrayList<String> booklist = 
      (ArrayList<String>)session.getAttribute("cart");
    
    if(booklist == null){
      booklist = new ArrayList<String>();  // 初回アクセス
    } else {
      req.setCharacterEncoding("utf-8");   // 2回目以降
      String book = req.getParameter("book");
      booklist.add(book);
    }
    session.setAttribute("cart", booklist);
    
    res.setContentType("text/html;charset=utf-8");
    PrintWriter out = res.getWriter();
    out.println("<html><head>");
    out.println("<title>注文画面</title>");
    out.println("</head><body>");
    out.println("<h2>商品を選択してください</h2>");
    out.println("<form action=\"/javaweb/session\" method=\"post\">");
    out.println("<select name=\"book\" size=\"1\">");
    out.println("<option value=\"超絶わかるJava\">超絶わかるJava</option>");
    out.println("<option value=\"小学生からはじめるJava\">小学生からはじめるJava</option>");
    out.println("<option value=\"Oracle試験100%合格本\">Oracle試験100%合格本</option>");
    out.println("</select><input type=\"submit\" value=\"追加\" /></form>");
    out.println("<h2>カートの中身</h2>");

    for(int i = 0; i < booklist.size(); i++){
      out.println(booklist.get(i) + "<br/>");
    }
    
    out.println("</body></html>");
  }
  public void doGet(HttpServletRequest req, HttpServletResponse res)
      throws IOException, ServletException {
    doPost(req, res);
  }
}

HttpServletRequestとHttpServletResponseについての詳しくはこの記事へ

参考記事

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?