English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

JSP セッション

HTTPは無状態プロトコルであり、これはクライアントがウェブページを検索するたびに独立したサーバーコネクションを開かなければならないことを意味しており、サーバーは前のクライアントのリクエストの情報を記録しません。

クライアントとサーバーのセッションを維持するためには、3つの方法があります:

    Cookies

ネットワークサーバーは、クライアントごとにユニークなセッションIDをcookieとして指定し、クライアントの次のリクエストを識別するために使用します。

これは効果的でない方法かもしれません。なぜなら、多くの場合、ブラウザがcookieをサポートしていないため、セッションの維持にはこの方法を使用することをお勧めしません。

    隠しフォームフィールド

ネットワークサーバーは、以下のようにユニークなセッションIDを含む隠しHTMLフォームフィールドを送信できます:

<input type="hidden" name="sessionid" value="12345">

このエントリは、フォームが提出されるたびに、指定された名前と値が自動的にGETまたはPOSTデータに含まれることを意味します。ブラウザがリクエストを送信するたびに、session_idの値を使用して異なるブラウザのトラッキングを保存できます。

これは効果的な方法かもしれませんが、<A HREF>タグ内のリンクをクリックすると、フォームの提出イベントが発生しません。したがって、隠しフォームフィールドも一般的なセッショントラッキングをサポートしません。

    URLのリライト

セッションを区別するために、URLの後ろに追加的なデータを追加できます。サーバーはこれらのデータに基づいてセッション識別子を関連付けることができます。

例えば、http://oldtoolbag.com/file.htm;sessionid=12345、セッション識別子はsessionid=12345、サーバーはこのデータを使用してクライアントを識別できます。

比較すると、URLのリライトがより良い方法です。ブラウザがcookiesをサポートしていない場合でも動作しますが、欠点は、セッションIDを動的に指定する必要があるため、簡単なHTMLページであってもすべてのURLに対応する必要があります。

    セッションオブジェクト

上記の方法に加えて、JSPはservletが提供するHttpSessionインターフェースを使用してユーザーを識別し、そのユーザーのすべてのアクセス情報を保存します。

デフォルトでは、JSPはセッショントラッキングを許可しており、新しいHttpSessionオブジェクトが新しいクライアントエンティティのために自動的にシリアライズされます。セッショントラッキングを禁止するには、page指令のsession属性値をfalseに設定して明示的にオフにします。以下のようにします:

<%@ page session="false" %>

JSPエンジンは、開発者にセッションオブジェクトを隠して提供します。セッションオブジェクトが提供されることで、開発者はデータを簡単に保存または検索できます。

以下にセッションオブジェクトの重要なメソッドの一覧を示します:

S.N.メソッド & 説明
                1public Object getAttribute(String name) 指定された名前でバインドされたオブジェクトをセッションオブジェクトから返します。存在しない場合nullを返します
                2public Enumeration getAttributeNames() セッションオブジェクト内のすべてのオブジェクト名を返します
                3public long getCreationTime() セッションオブジェクトが作成された時間をミリ秒単位で返します。から1970年1月1号午前0時に基づいて計算されます
                4public String getId() セッションオブジェクトのIDを返します
                5public long getLastAccessedTime() クライアントの最終アクセス時間をミリ秒単位で返します。から1970年1月1号午前0時に基づいて計算されます
                6public int getMaxInactiveInterval() 最大時間間隔を秒単位で返します。サーバーコンテナはこの時間内にセッションを開いて保持します
                7public void invalidate() セッションを無効化し、セッションにバインドされているすべてのオブジェクトを解绑します
                8public boolean isNew() 新しいクライアントであるか、クライアントがセッションに参加を拒否したかを返します
                9public void removeAttribute(String name) session中の指定された名前のオブジェクトを削除します
                10public void setAttribute(String name, Object value)  指定された名前と値を使用してオブジェクトを生成し、sessionにバインドします
                11public void setMaxInactiveInterval(int interval) 秒単位で指定された時間内にセッションが有効であることを指定します

JSPセッションアプリケーション

このインスタンスは、HttpSessionオブジェクトを使用して作成時間と最終アクセス時間を取得する方法を説明しています。存在しない場合には、requestオブジェクトに新しいsessionオブジェクトを関連付けます。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<%
   // sessionの作成時間を取得します
   Date createTime = new Date(session.getCreationTime());
   // 最終アクセスページの時間を取得します
   Date lastAccessTime = new Date(session.getLastAccessedTime());
   String title = "再訪問基本トレーニングウェブサイトのサンプル";
   Integer visitCount = new Integer(0);
   String visitCountKey = new String("visitCount");
   String userIDKey = new String("userID");
   String userID = new String("ABCD");
   // ウェブページに新しい訪問者がいるかを検出
   if (session.isNew()){
      title = "訪問基本トレーニングウェブサイトのサンプル";
      session.setAttribute(userIDKey, userID);
      session.setAttribute(visitCountKey,  visitCount);
   } else {
       visitCount = (Integer)session.getAttribute(visitCountKey);
       visitCount += 1;
       userID = (String)session.getAttribute(userIDKey);
       session.setAttribute(visitCountKey,  visitCount);
   }
%>
<html>
<head>
<title>セッション追跡</title>
</head>
<body>
<h1>セッション追跡</h1>
<table border="1" align="center"> 
<tr bgcolor="#949494">
   <th>セッション情報</th>
   <th>値</th>
</tr> 
<tr>
   <td>id</td>
   <td><% out.print( session.getId()); %></td>
</tr> 
<tr>
   <td>作成時間</td>
   <td><% out.print(createTime); %></td>
</tr> 
<tr>
   <td>最終アクセス時間</td>
   <td><% out.print(lastAccessTime); %></td>
</tr> 
<tr>
   <td>ユーザーID</td>
   <td><% out.print(userID); %></td>
</tr> 
<tr>
   <td>訪問回数</td>
   <td><% out.print(visitCount); %></td>
</tr> 
</table> 
</body>
</html>

試してみてアクセス http://localhost:8080/testjsp/main.jsp 、初回実行時には以下の結果が得られます:

再度アクセスすると、以下の結果が得られます:

セッションデータを削除

ユーザーのセッションデータを処理した後、以下の選択肢があります:

  • 特定の属性を削除:

    public void removeAttribute(String name) メソッドを呼び出して指定された属性を削除します。

  • セッション全体を削除:

    public void invalidate() メソッドを呼び出してセッション全体を無効にします。

  • セッションの有効期限を設定:

    public void setMaxInactiveInterval(int interval) メソッドを呼び出してセッションのタイムアウトを設定します。

  • ユーザーをログアウト:

    servlet をサポート2.4バージョンのサーバーでは、logout() メソッドを呼び出してユーザーをログアウトし、すべての関連するセッションを無効にすることができます。

  • web.xml ファイルを設定します:

    Tomcatを使用している場合、以下のように web.xml ファイルを設定できます:

  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

タイムアウトは分単位で、Tomcatのデフォルトのタイムアウトは3分。

Servletの getMaxInactiveInterval( ) メソッドは秒単位でタイムアウト時間を返します。web.xml で設定されているのは15分、なら getMaxInactiveInterval( ) メソッドは返します900。