セッション

セッションとは

今回は、セッション(SESSION)に関する説明をします。JSP/Servletのみならず、セッションとはWebアプリケーションにとって大事な概念なので、まずはその説明をしていくことにしましょう。

セッションとは、WEBアプリケーションではWEBページに接続してから切断するまでの通信の事です。では一体なぜセッションが必要なのでしょうか?通常、Webアプリケーションには多数のユーザーが接続します。その際、同一アプリケーションであっても、接続するユーザーごとに得られる結果は違うはずです。そのため、一連の動作をする時の誰が何をしているかといった判断が必要になってきます。その時に役立つのがセッションなのです。(図5-1.)

図5-1.resourceテーブルのpriceによる昇順の並べ替え
昇順の並べ替え

ユーザーがログインする必要があるアプリなどは、ログインしているユーザーの識別や、ログイン状態そのものの確認などのために利用されます。

サンプルプログラム

では実際に、セッションを使ったサンプルを紹介しましょう。以下のサンプルを入力してみてください。

sample1_from.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>sample1_from.jsp</title>
</head>
<body>
<h2>sample1_from.jsp</h2>
<!-- セッションIDを取得 -->
<p>session ID:<%= session.getId() %></p>
<!-- セッションで値を設定 -->
<%
	session.setAttribute("foo","bar");
	session.setAttribute("hoge","fuga");
%>
<p><a href = "sample1_to.jsp">sample1_to.jsp</a></p>
</body>
</html>

sample1_to.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>sample1_to.jsp</title>
</head>
<body>
<h2>sample1_to.js</h2>
<p>session ID:<%= session.getId() %></p>
<p>foo:<%= session.getAttribute("foo") %></p>
<p>hoge:<%= session.getAttribute("hoge") %></p>
<h2>request Object</h2>
<p>Referer:<%= request.getHeader("referer") %></p>
<p><a href = "sample1_from.jsp">sample1_from.jsp</a></p>
</body>
</html>

sample1_from.jspが遷移前、sample1_to.jsp遷移後のページになります。したがって、まずはsample1_from.jspを起動してください。URLは、http://localhost:8080/jsp/day5/sample1_from.jspとなります。(図5-2.)

図5-2.sample1_from.jspを実行
sample1_from.jspを実行

実行すると、セッションIDが表示されます。ここで、下のリンクをクリックすると、sample1_to.jspに移ります。実行結果は以下のようになります。(図5-3.)

図5-3.sample1_to.jsp
sample1_to.jsp

セッションIDは、同一の値が出ていることが分かります。セッションはブラウザーが全て閉じられるまで持続されます。サーバーの設定により、一定時間アクセスしなかった場合もセッションが終了することがあります。一度すべてのブラウザーを閉じて再度sample01_from.jspを実行してみてください。

セッションIDの取得

セッションもまた、requestなどと同様、暗黙オブジェクトの一つである、sessionによって扱われます。セッションのIDを取得するのには、以下の処理を行います。

セッションIDの取得
session.getId()

続いて、降順の並べ替えを見てみることにしましょう。実行結果から、sample1_from.jspおよび、sample1_to.jspは、同一のセッションIDを持つことが分かります。

セッションへでの値の設定

すでに説明した通り、セッションでは、値を設定することができます。書式は以下のようになります。

セッションでの値の設定
session.setAttribute("名前","値")

これは、同一セッション内で使える変数のようなものだと考えてください。この方法で設定した値は、同一セッション内で取り出すことができます。それが、以下の方法です。

セッションの値の取得
session.getAttribute("名前");

取得した値は、Stringとして取得できますので、数値などを扱いたいのであれば、必要に応じてラッパクラスなどを用いて変換する必要があります。

このサンプルでは、setAttributeを、sample1_from.jspの15行目から16行目で行っています。「foo」という名前に、「bar」という値が、そして、「hoge」という名前に「fuga」という値が設定されています。また、この値を取得し表示しているのが、sample1_to.jspの12行目および13行目です。実行結果より、それぞれに設定されている値が取得されていることがわかります。(図5-4.)

図5-4.セッションへの値の設定と取得
セッションへの値の設定と取得

これを利用すれば、共通するセッション内で異なるページでも値を保持したり、変更したりすることができるようになります。

ヘッダー情報とリフェラー

ヘッダ-情報とは

続いて、ヘッダー情報に関する説明をします。ヘッダー情報とは、サーバーにリクエストを送付した際に送れれてくるHTML情報と付随した情報で、送信されるページに関する様々な情報が記述されています。(図5-5.)

図5-5.ヘッダー情報
ヘッダー情報

通常、これらは表示部分とは無関係なので表示されることはありません。そのため、取得するには特別な方法が必要になります。

実はセッションIDは、このヘッダ情報の一つなのです。セッションは特別な情報なため、特別に取り上げましたが、この他にもヘッダ情報には様々なものがありますが、ここではもう一つ別のヘッダ情報の一つとして、リフェラーを紹介しましょう。

リフェラーとは

リフェラーとは、ブラウザで表示する直前に閲覧していたページのURLの情報です。これを辿っていくと閲覧者がどこのサイトから訪問したのか、また、サイト内でどのような軌跡を辿ったのかなどを調べることができます。

リフェラーの取得

ここで紹介したサンプルでは、sample1_to.jspの15行目でリフェラーの情報を取得しています。

リフェラーの取得
request.getHeader("referer")

このgetHeaderというメソッドは、ヘッダーに含まれる情報です。ヘッダー情報を取得するためのメソッドです。ここでは、リフェラーを取得するため、「referer」と記述しています。これにより、リフェラーの情報が取得できます。