JavaのServletのセッション（session）管理

## セッション（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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2785154/d0ecfc5e-37a3-705e-b983-6cdbc0265b1f.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");   // ２回目以降
      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についての詳しくはこの記事へ

https://qiita.com/mrshouuge/items/aa8c02af562a35e547aa

## 参考記事
https://www.youtube.com/watch?v=CYmHuawjF7k