連載
» 2002年12月10日 00時00分 公開

Webサービスにも必要なセッション管理パソコンで試してわかるWebサービス(5)(3/5 ページ)

[イチロー,樋口研究室監修]

Webブラウザのセッション管理技術「Cookie」

 HTTPというプロトコルは1回の要求/応答ごとにTCP/IPのセッションを切断する仕様です。これは、「HTTPがステートレスなプロトコル」であることを意味します。HTTP 1.1からはパフォーマンス向上の観点からTCP/IPをすぐに切断せずに再利用する仕組みがありますが、これはセッションを保持するためではなく、あくまでもパフォーマンス向上を狙ったものです。そのため、「ステートフル」というわけではなく、あくまでも「HTTPはステートレスなプロトコル」です。

 このようなプロトコルの特徴があるため、WebブラウザがWebサーバとのセッションを仮想的に保持するために「Cookie」が利用されています。「Cookie」という番号札をWebサーバとWebブラウザが共有することでセッション管理をします。番号札が同じものであり続ければそれは「1つのセッション」と見なされますが、異なる番号であると「別セッション」となります。

 TCPモニタで確認したWebサービスの6回の要求/応答では、すべて違う「番号札」であることが一目瞭然ですので、それぞれの要求/応答は「別セッション」ということになります。そのため、実行結果も「0 0」になることは理解していただけるでしょう。

AxisにおけるCookieを使ったセッション管理

 では、宿題プログラムが想定しているような動きをするにはどのようなCookieの使い方になればいいのでしょうか? これは、ServletやJSPなどのWebアプリケーションを書いたことのある人であれば容易に想像がつくかもしれませんね。

 「Set-Cookie」はWebサーバ側がWebアプリケーションに対して渡す「番号札」です。この番号札であるCookieを2回目以降の要求において、WebブラウザからWebサーバ側に渡すことができれば、Webサーバは前回の要求/応答と同じセッションだと認識します。

 これをWebサービスにも応用することができます。Webサービス側が最初の要求/応答で「Set-Cookie」を使って番号札をWebサービス・クライアントに渡します。Webサービス・クライアントは2回目以降の要求/応答、すなわち、「invoke」メソッドを呼び出した際に「Cookie」をWebサービス側に返してあげられればいいはずです。

 理屈的にはこのような動作になりますが、いちいち「Cookie」を扱うプログラムをWebサービス・クライアントに記述しなくてはいけないのでしょうか? 実はAxisには便利なAPIがあり、それを利用することで容易にセッションを利用できるようになります。このセッション利用APIを見てみることにしましょう。

図1 Axisがもつセッション管理実現の仕組み 図1 Axisがもつセッション管理実現の仕組み

Webサービス・クライアントでSessionスコープを有効にする

 セッションを利用できるようにするには、Webブラウザが持っている機能をWebサービス・クライアントにおいても実現することです。いちいち記述することは大変面倒ですが、Axisには便利なAPIが用意されているため、大変容易にセッションを利用することができます。

 Axisには「setMaintainSession()」メソッドが用意されています。このメソッドはServiceインスタンスに対して実行することで、Cookieを扱えるようにしてくれるものです。利用方法は、次のようにWebサービス・クライアントプログラムを変更するだけです。

  ●SimpleAddClient.java(セッションを利用できるように変更)
package atmarkit;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.utils.Options;
import javax.xml.rpc.ParameterMode;
import javax.xml.namespace.QName;

public class SimpleAddClient {

    public static void main(String [] args) {

〜中略〜

            Service  service = new Service();
            service.setMaintainSession(true);
            Call call = (Call) service.createCall();

〜以下略〜

    }
}

 Webサービス・クライアントプログラムを修正したら、再コンパイルします。

>javac atmarkit\SimpleAddClient.java

 コンパイル後、再度実行してみましょう。

>java atmarkit.SimpleAddClient 1 5 http://localhost:8081/axis/servlet/AxisServlet
1
6

>java atmarkit.SimpleAddClient 2 8 http://localhost:8081/axis/servlet/AxisServlet
2
10

 今度はsessionスコープが有効になり、想定していた動きをしています。この動作はapplicationスコープとも違うのが分かりますか?

 1回目と2回目は別セッションになっているため、それぞれの起動ごとに初期化され、加算されています。この動きは第3回「JavaBeansからWebサービスを作る」において、Javaアプリケーションでテストしたときと同じ動きといえるでしょう。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。