Javaのサーブレットのセッションのサンプルです。
(確認環境:Windows10,Eclipse4.6 (JavaEE),apache-tomcat-8.0.39)
目次
サンプル | セッションとは |
セッションの流れ | |
環境 | |
セッションのサンプル | |
セッションタイムアウトの時間の設定 |
セッションとは
クライアントの画面で文字を入力してサーバーにデータを送信すると(リクエスト)、サーバーからの返信(レスポンス)でやり取りは終了します。
もう一度クライアントの画面からサーバーにデータを送信しても、サーバーは同じユーザから送信されたのかどうか判別することができません。
そのため、クライアントとサーバーの複数回のやり取りで、同じユーザが操作していることを認識したい時は、セッションの仕組みを使用します。
セッションの流れ
1.クライアントがWebサーバーにアクセスします。
2.WebサーバーのプログラムがセッションIDを生成してクッキーでクライアントに送ります。
3.再度クライアントがWebサーバーにアクセスする時、クライアントはクッキーをWebサーバーに送信します。
4.WebサーバーのプログラムはクッキーのセッションIDを取得して対象を識別します。
サンプルの環境
Test1.javaにコードを書いています。
アクセスするURLは以下です。
http://localhost:8080/test2/testjava
セッションのサンプル
ブラウザを更新すると文字と数値が表示されます。数値は更新毎に1増加します。
4回更新をするとinvalidateメソッドでセッションが切れendと表示します。
更新して5秒を超えて何もしないとsetMaxInactiveIntervalメソッドでセッションが切れます。
ブラウザの種類が違うとセッションが別になります。(例:chromeとFireFox)
package test1;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/testjava")
public class Test1 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
try{
HttpSession hs = request.getSession();
hs.setMaxInactiveInterval(5); //5秒
String name = (String)hs.getAttribute("name");
Integer cnt = (Integer)hs.getAttribute("count");
if(hs.isNew()){
cnt = 0;
name = "First time";
}else{
cnt = cnt + 1;
}
PrintWriter pw = response.getWriter();
if(cnt==3){
hs.invalidate();
pw.println("end");
}else{
hs.setAttribute("count", cnt);
hs.setAttribute("name", "test1");
pw.println("name=" + name + "," + "cnt=" + cnt);
}
}
catch(Exception e){
e.printStackTrace();
}
}
}
@WebServlet("/testjava")
13行目の/testjavaは、URLでアクセスする時に使用します。
HttpSession hs = request.getSession();
21行目のgetSessionメソッドは、リクエストに紐付いているセッションを返します。
リクエストがセッションを持たない場合セッションを作ります。
hs.setMaxInactiveInterval(5); //5秒
22行目のsetMaxInactiveIntervalメソッドは、セッションを無効にするまでのクライアント要求の間隔を秒単位で指定します。
ゼロまたはマイナスの値を指定すると、セッションはタイムアウトしません。
String name = (String)hs.getAttribute("name");
Integer cnt = (Integer)hs.getAttribute("count");
上記24,25行目のgetAttributeメソッドは、Objectで返します。
そのため、それぞれStringとIntegerでキャストをしています。
nameとcountはキーになります。
キーは、任意の名称をつけることができます。
if(hs.isNew()){
上記27行目のisNewメソッドは、クライアントがセッションをまだ認識していない場合trueを返します。
https://tomcat.apache.org/tomcat-7.0-doc/servletapi/javax/servlet/http/HttpSession.html#isNew()
hs.invalidate();
37行目のinvalidateメソッドは、セッションを無効にします。
https://tomcat.apache.org/tomcat-7.0-doc/servletapi/javax/servlet/http/HttpSession.html#invalidate()
hs.setAttribute("count", cnt);
hs.setAttribute("name", "test1");
40,41行目のsetAttributeメソッドは、セッションに値をセットします。
countとnameがキーで、cntとtest1は値です。
セッションタイムアウトの時間の設定
セッションタイムアウトの時間の設定は、Tomcatのweb.xmlのsession-timeoutタグで指定できます。デフォルトは30分です。
関連の記事
Java JSTLのカスタムタグの導入と使用例のサンプル(core,i18n)
Java サーブレット・JavaBeans・jspが連携するサンプル