2
1

More than 3 years have passed since last update.

セッション管理

Posted at

セッション

サーバ内に情報を保存し、異なるページ間で同一のクライアントを認識する仕組みのことです。

セッション管理

1.クライアントが初めてServletプログラムにアクセスした際、セッションIDが生成されます。
2.生成されたセッションIDはクライアントに返され、保管されます。
3.再びクライアントがServletプログラムにアクセスする際にセッションIDがクライアントから送信されます。
4.Servletプログラムでは送信されたセッションIDにより、同一クライアントかどうかを判断します。

これらの一連の処理はcookieにより管理されます。cookieが使えない環境では、URLリンクでセッションIDを管理することもできます。

戻り型 メソッド 説明
HttpSession getSession( ) HttpServletRequestインタフェースで定義されているメソッドです。セッションオブジェクト(セッションID)を返します。セッションオブジェクトが生成されていない場合は、セッションオブジェクトを生成して返します。
Object getAttribute(String) HttpSessionインタフェースで定義されているメソッドです。引数に指定されたデータ名に該当するセッションスコープのデータ値を返します。該当のデータ名がない場合にはnullを返します。
void void setAttribute(String, Object) HttpSessionインタフェースで定義されているメソッドです。第一引数にデータ名、第二引数にデータ値を指定し、セッションスコープを持つデータ値を登録します。すでにデータ名が存在する場合は、新しく指定されたデータ値が上書きされます。
void invalidate( ) 生成されているセッションオブジェクト(セッションID)を破棄します。
boolean isNew( ) クライアントがセッション管理されていないときにtrueを返します(初めてアクセスしたとき、クラインアントがcookieを使えないときなど)。クライアントがセッション管理されていないときにtrueを返します(初めてアクセスしたとき、クラインアントがcookieを使えないときなど)。

セッションのタイムアウト

セッションIDは一定時間経過するか、クライアントのブラウザを閉じるか、もしくはinvalidateメソッドを呼び出すと削除されます。どの程度経過するとセッションIDが削除されるかはweb.xmlのタグで指定できます。Tomcatのデフォルトの設定では30分になっています。また、HttpSessionインタフェースには、セッションごとに経過時間を設定できるsetMaxInactiveIntervalメソッド、getMaxInactiveIntervalメソッドが用意されています。

要素   内容
session-timeout セッションのタイムアウト時間を分単位で指定します。0もしくは0以下の値を指定した場合は、セッションがタイムアウトしないことを表します。

設定例

セッションのタイムアウトを180分に設定した例です。タグはタグ、タグの後に記述する必要があります。

<session-config>
    <session-timeout>180</session-timeout>
</session-config>

Javaにおける使用例

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SessionServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        String id = "Java";

        /**
         * セッションオブジェクトが生成されていない場合、getSessionメソッドでセッションオブジェクトを生成します。
         * セッションオブジェクトがすでに生成されている場合は、既存のセッションオブジェクトを返します。
         **/
        HttpSession hs1 = req.getSession();
        PrintWriter out = res.getWriter();
        out.println("<HTML>");
        out.println("<BODY>");

        /**
         * クライアントがセッション管理されているかどうか(はじめてアクセスしたかどうか)で表示メッセージを変えます。
         * セッション管理されていない場合、データidをsetAttributeメソッドで保存し、"id + Nice to meet you."を表示します。
         * セッション管理されている場合は、データidの値をgetAttributeメソッドで取得し、"Hello! + id"を表示します。
         **/
        if (hs1.isNew()) {
            hs1.setAttribute("id", id);
            out.println(hs1.getAttribute("id") + " Nice to meet you.");
        } else {
            out.println("Hello! " + hs1.getAttribute("id"));
        }

        out.println("</BODY>");
        out.println("</HTML>");
    }
}

cookieが使用できない場合のセッション管理

クライアントがcookieを使用できない場合、URLリンクにセッションIDを付与することによりセッション管理ができるようになります。ServletプログラムはURLリンクから、同一クライアントかどうかを判別します。セッションIDが付与されたURLリンクを作成するためには以下のメソッドを使用します。

戻り型 メソッド 説明
String encodeURL(String) HttpServletResponseインタフェースで定義されているメソッドです。引数に指定されたURLにセッションIDを付与したURLを生成します。cookieを使用できる環境などセッションIDを付与する必要がない場合は、URLは変化しません。
String encodeRedirectURL(String) HttpServletResponseインタフェースで定義されているメソッドです。sendRedirectメソッドで使用するためにセッションIDを付与したURLを生成します。cookieを使用できる環境などセッションIDを付与する必要がない場合は、URLは変化しません。

Javaにおける使用例

String url = res.encodeURL("./SessionServlet");
out.println("<A HREF=\"" + url + "\">SessionServlet</A>");
2
1
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
2
1