セッションは大事ですね。
HTTP自体は、ステートレスなものなので、画面遷移するとつながりがなくなってしまいます。。
そこで、クッキーを使って、画面間でデータを維持するのが、セッション。
・・・なわけですが、あまり大きなものは入れてはいけません。(設定によりけりだが、メモリ不足になるよー。)
ま、何らかユーザーを識別できるようなものを格納しといて、あとはデータベースとかに入れとくって感じですかね。
(↑ユーザーIDとは言っていないw)
HttpSessionを使って、ユーザー情報を残すサンプル
アクセスカウンター代わりに、ブラウザでアクセスする度に、カウントアップしてみます。
カウントした数値は、セッション(HttpSession)に保管しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class SessionTestServlet extends HttpServlet { public static final String SESSION_KEY = "hogehoge"; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); int i = 0; //セッションから、前回の値があれば、取り出し。 if(session.getAttribute(SESSION_KEY) != null) { i = (int)session.getAttribute(SESSION_KEY); } //加算 i++; //加算後の値をセッションへセット。 session.setAttribute(SESSION_KEY, i); //ブラウザへ表示 try(PrintWriter pw = resp.getWriter()){ pw.print("<html><body>"); pw.print("<h1>"); pw.print(i); pw.print("</h1>"); pw.print("</body></html>"); pw.flush(); } } } |
実行結果
ブラウザで更新を押すたびに、カウントアップしていきます。
最初は、こんな感じ。
更新を押すと、こんな感じ。
サンプルの解説
HttpSessionを使うと、ブラウザ側にクッキーを残します。
クッキーの中には、ユーザーを識別するためのセッションIDが記録されます。
※ブラウザ側に値が記録されるわけではありません。
クッキーは、サイトへアクセスする際にブラウザが一緒に送ってくれるため、サーバー側でクッキーのセッションIDをもとに、覚えておいたセッション情報を取り出すことができるようになります。
ですが、このあたりはとくに意識しなくても、アプリケーションサーバー(Tomcatなど)が勝手にやってくれますので、セッション(HttpSession)から拾ってくるだけでOKです。
また、アプリケーションサーバーによりますが、多くの場合、デフォルトで時間制限がついてます。
時間制限を超えると、セッションに覚えていた情報へアクセスができなくなりますので、気を付けましょう。
・・・というわけで、これらを踏まえると、このサンプルでは次のようなことが起こります。
ほかの人が見ると、カウントは1からはじまる。
ブラウザを閉じて、もう一度開くと、1に戻る。
しばらく放っておいてから見てみると、1に戻る。
HttpSessionのユーザー情報をクリアするには?
セッション情報の無効化(クリア)する方法は、こちらを見てください。