3
3

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 3 years have passed since last update.

Java sessionスコープ

Last updated at Posted at 2020-01-28

趣味でプログラミングを勉強しています。
古本販売サイトを作成したいと思って勉強を始めたのですが、サーバ上でウェブページなどを動的に生成したりデータ処理を行うためには、Java Servlet(ジャバ サーブレット)の知識が必要ということで勉強を始めました...(^^;)
古本サイトを例に考えた場合にお客さんがカートに入れた情報を保持する、session(セッション)の概念がいまいちわかりにくかったので、今回記事にしてみました!! ヾ ^
^♪

  • セッション

    • ユーザーごとの状態を保持する仕組み
  • サーブレットではjavax.servlet.http.HttpSessionインターフェースを使って扱う

 CounterServlet.java
package session;

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 CounterServlet extends HttpServlet {
	public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{

		//1.セッションの取得
		HttpSession session = request.getSession();

		//2.セッションからのオブジェクトの取得
		Integer count = (Integer)session.getAttribute("count");

		//3.カウンタを+1
		if(count == null){
			count = new Integer(0);
		}
		count = new Integer(count.intValue() + 1);

		//4.セッションにオブジェクトを格納
		session.setAttribute("count", count);

		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<html><body>");

		//セッションIDの表示
		out.println("<p>sessionId=" + session.getId());

		//セッションIDの表示
		out.print("<p>count=" + count);

		//このサーブレットへのリンクの表示
		String linkurl = request.getRequestURI();
		out.println("<p><a href=\"" + linkurl + "\">RELOAD</a>");
		out.println("</body></html>");
	}

}
  1. HttpSessionオブジェクト生成時には、アプリケーションサーバから一意の識別子「セッションID」が割り当てられます。セッションの同一性は、このセッションIDによって担保されているようです。
  2. セッション属性から"count"という名前のオブジェクトを取得、Integer型にキャストしています。
    最初のリクエストはセッション属性にcountという名前のオブジェクトは登録されていないので、countの値はnullになります。
  3. カウントアップ
    最初の段階でnullなので0を代入します。
  4. setAttributeメソッドで、1を足した後の値をセッション属性に登録します。

セッションスコープにおけるデータの受け渡し
リクエストスコープに登録されたデータは、リクエストをまたいで受け渡すことができませんでしたが、セッションスコープに登録されたデータは受け渡すことが可能です。

  • requestスコープ

    • 1回のHTTPプロトコルで実行される、サーブレットとforwardされたJSP間で有効なオブジェクト
    • リクエストの処理が終わると破棄
    • HttpServletRequest属性として設定
  • sessionスコープ

    • 同一のセッションで実行される、サーブレットやJSPで有効なオブジェクト
    • 一定時間経過でsession終了ともに破棄
    • HttpSessionの属性として設定
セッションスコープのオブジェクトを操作するメソッド

Object getAttribute(java.lang.String name)
引数で指定したオブジェクトを取得します。存在しない場合はnullを返します。
返ってくる型はObject型ですので、適切にキャストして利用することが多いようです。

void setAttribute(java.lang.String name, java.lang.Object value)
引数valueで指定したオブジェクトをnameという名前で登録します。

void removeAttribute(java.lang.String name)
引数nameで指定したオブジェクトを削除します。

java.util.Enumeration getAttributeNames()
登録されているnameの一覧を返します。

セッションタイムアウト
セッションデータを削除していかなければ、使われないデータがサーバー上に残ってしまいます。
回避策として、クライアントが最後にアクセスしてからの経過時間をチェックして、削除する仕組みがアプリケーションサーバーに搭載されています。

web.xml
<session-config>
        <session-timeout>3</session-timeout>
</session-config>
3
3
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
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?