セッション
セッション・・・各ユーザに固有のデータを格納するための仕組み。アプリケーションサーバに保存されるセッションIDで、ユーザを区別する。
セッション属性・・・ユーザごとのデータを保持する。セッションIDに紐づく。
セッションの開始
ユーザからのリクエストを受け取ると、アプリケーションサーバを受け取るとセッションIDを発行し、レスポンスとしてブラウザに戻す。
ブラウザは、セッションIDをクッキーに保存する。
2回目以降のアクセス
ユーザが同じサイトの別ページを開くと、クッキーからセッションIDをアプリケーションサーバに送信する。アプリケーションサーバは、セッションIDを受取り、セッションデータを取得する。
@WebServlet(urlPatterns={"/chapter17/search"}) public class Count extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter pw = resp.getWriter(); Page.header(pw); // HttpSessionオブジェクトの取得 HttpSession hs = req.getSession(); // セッション属性から値の取得 Integer count = (Integer)hs.getAttribute("count"); // 値の設定 if (count == null) { count = 0; } count++; // セッション属性の設定 hs.setAttribute("count", count); pw.println("<p>" + count + "</p>"); pw.println("<p>" + hs.getId() + "</p>"); Page.footer(pw); } }
<p>カートに追加する商品を入力してください。</p> <form action="cart-add" method="post"> 商品名<input type="text" name="name"> 価格<input type="text" name="price"> <input type="submit" value="追加"> </form>
@WebServlet(urlPatterns={"/chapter17/cart-add"}) public class CartAdd extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter pw = resp.getWriter(); Page.header(pw); // form属性から値の取得 String name = req.getParameter("name"); int price = Integer.parseInt(req.getParameter("price")); // HttpSessionオブジェクトの取得 HttpSession session = req.getSession(); // セッション属性から値の取得 List<Product> cart = (List<Product>)session.getAttribute("cart"); if(cart==null) { cart = new ArrayList<Product>(); } // Beanに値の設定 Product p = new Product(); p.setName(name); p.setPrice(price); cart.add(p); // セッション属性に値の設定 session.setAttribute("cart", cart); pw.println("カートに商品を追加しました。"); Page.footer(pw); } }
@WebServlet(urlPatterns={"/chapter17/cart-get"}) public class CartGet extends HttpServlet { @SuppressWarnings("unchecked") @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter pw = resp.getWriter(); Page.header(pw); HttpSession session = req.getSession(); List<Product> cart = (List<Product>)session.getAttribute("cart"); for(Product p : cart) { pw.println("<p>"); pw.println(p.getName()); pw.println(":"); pw.println(p.getPrice()); pw.println("</p>"); } Page.footer(pw); } }
@WebServlet(urlPatterns={"/chapter17/cart-remove"}) public class CartRemove extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter pw = resp.getWriter(); Page.header(pw); HttpSession session = req.getSession(); // セッション属性の削除 session.removeAttribute("cart"); // すべてのセッション属性を削除し、セッションを終了させる場合は、以下の書き方 // session.invalidate(); Page.footer(pw); } }