JSP Session

HTTPはステートレスプロトコルです。つまり、クライアントがウェブページを取得するたびに、サーバーへの接続を個別に開く必要があり、サーバーは以前のクライアントリクエストの情報を一切記録しません。

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


Cookies

Webサーバーは、各クライアントを表すcookieとして一意のセッションIDを指定し、そのクライアントの後続のリクエストを識別できます。

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


隠しフォームフィールド

Webサーバーは、隠しHTMLフォームフィールドと一意のセッションIDを送信できます。たとえば次のようになります。

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

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

この方法は有効かもしれませんが、<A HREF>タグ内のハイパーリンクをクリックしてもフォーム送信イベントは発生しないため、隠しフォームフィールドも一般的なセッショントラッキングをサポートしません。


URLリライト

各URLの後に追加データを付加してセッションを区別できます。サーバーはこのデータに基づいてセッション識別子を関連付けることができます。

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

それに比べて、URLリライトはより良い方法です。ブラウザがcookieをサポートしていなくても機能しますが、欠点は、単純なHTMLページであっても、すべてのURLにセッションIDを動的に指定する必要があることです。


セッションオブジェクト

上記の方法以外に、JSPはサーブレットが提供するHttpSessionインターフェースを利用してユーザーを識別し、そのユーザーのすべてのアクセス情報を保存します。

デフォルトでは、JSPはセッショントラッキングを許可し、新しいHttpSessionオブジェクトが新しいクライアントのために自動的にインスタンス化されます。セッショントラッキングを無効にするには、pageディレクティブのsession属性の値をfalseに設定して明示的に無効にする必要があります。次のようにします。

<%@ page session="false" %>

JSPエンジンは暗黙のセッションオブジェクトを開発者に公開します。セッションオブジェクトが提供されるため、開発者はデータを簡単に保存または取得できます。

次の表に、セッションオブジェクトのいくつかの重要なメソッドを示します。

S.N. メソッド & 説明
1 public Object getAttribute(String name)

セッションオブジェクト内で指定された名前にバインドされているオブジェクトを返します。存在しない場合はnullを返します。 2 public Enumeration getAttributeNames()

セッションオブジェクト内のすべてのオブジェクト名を返します。 3 public long getCreationTime()セッションオブジェクトが作成された時刻をミリ秒単位で返します。1970年1月1日午前0時から計算されます。 4 public String getId()セッションオブジェクトのIDを返します。 5 public long getLastAccessedTime()クライアントが最後にアクセスした時刻をミリ秒単位で返します。1970年1月1日午前0時から計算されます。 6 public int getMaxInactiveInterval()最大時間間隔を秒単位で返します。サーブレットコンテナはこの期間中セッションを開いたままにします。 7 public void invalidate()セッションを無効化し、そのセッションにバインドされているすべてのオブジェクトをバインド解除します。 8 public boolean isNew()新しいクライアントであるかどうか、またはクライアントがセッションへの参加を拒否したかどうかを返します。 9 public void removeAttribute(String name)セッション内の指定された名前のオブジェクトを削除します。 10 public void setAttribute(String name, Object value) 指定された名前と値を使用してオブジェクトを生成し、セッションにバインドします。 11 public void setMaxInactiveInterval(int interval)時間を秒単位で指定するために使用します。サーブレットコンテナはこの期間中セッションを有効に保ちます。

JSP Session の応用

この例では、HttpSessionオブジェクトを使用して作成時刻と最終アクセス時刻を取得する方法を説明します。リクエストオブジェクトに新しいセッションオブジェクトを関連付けます(まだ存在しない場合)。

<%@ 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>Session 跟踪</title>
</head>
<body>

<h1>Session 跟踪</h1>

<table border="1" align="center"> 
<tr bgcolor="#949494">
   <th>Session 信息</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のデフォルトのタイムアウト時間は30分です。

ServletのgetMaxInactiveInterval() メソッドはタイムアウト時間を秒単位で返します。web.xmlで15分に設定した場合、getMaxInactiveInterval() メソッドは900を返します。

その他の拡張