はじめに
Webアプリケーションを作成する上で避けて通れない機能の一つにセッション管理があります。ユーザーが入力画面で入力した情報を、確認画面でセッションに保存し、完了画面を出力する前にセッションから復元してDBなどのストレージに格納する、というフローなどで使用されます。
PC用のWebアプリケーションならば、クッキーを用いることでこのセッション管理を行うことができますが、現在の携帯の多くはクッキーを利用できないため、同様の処理を行うことはできません。
そこで本稿では、携帯でのセッション管理の実装方法について解説していきます。
対象読者
- CPANモジュールのインストールができる方。
- PC用のWebアプリケーションでのセッション管理を理解している方。
必要な環境
- Perl 5.8以上が動作するサーバ(筆者環境ではPerl 5.8.8)。
- Apache 1.3系、2.x系が動作するサーバ(筆者環境ではApache 2.2)。
- MySQLが動作するサーバ(筆者環境ではMySQL 5.0.27)。
今回使用したCPANモジュール
- CGI 3.25
- CGI::Session 4.20
- HTML::SticyQuery 0.12
- Template 2.15
サンプルアプリケーションのディレクトリ構成
今回用意したサンプルアプリケーションのディレクトリ構成は次のようになっています。
「index.cgi」がメインのアプリケーションです。「template」にはアプリケーションで使用するテンプレートが置かれています。「misc」以下にある「session.sql」は今回のサンプルアプリケーションで使用しているセッション格納用のテーブル定義です。
/ +- index.cgi +- template +- confirm.tt | +- finish.tt | +- index.tt | +- input.tt | +- misc +- session.sql
本稿ではこのサンプルアプリケーションを例に実装内容を紹介しますので、説明と合わせてご覧ください。
携帯でセッションを管理する
セッション管理は、ユーザーからのリクエストごとに一意のID(セッションID)を発行し、常にそのIDをリクエストに含ませることで行います。PCであればクッキーを使用してセッションIDをブラウザに保持しておくことができますが、前述したとおり携帯ではクッキーを使用できる端末が限られるため、画面遷移時にセッションIDを直接リクエストのパラメータとして渡す必要があります。
パラメータを引き継ぐ必要のある遷移のパターンは以下の3つです。
- リンクによる遷移
- フォームによる遷移
- リダイレクトによる遷移
では、この3つの遷移について、具体的にどのように実装するのかサンプルソースを例に見ていきましょう。
リンクによる遷移
リンクによる遷移では、a
タグのhref
属性にセッションIDを付加する必要があります。この処理はHTML::StickyQuery
を利用すると簡単です。サンプルソースでは sticky_session_id()
という関数内でその処理を行っています。今回はセッションIDのキーを「session_id
」として付加しています。
## セッションIDを href に付加する my $stq = HTML::StickyQuery->new; return $stq->sticky( scalarref => \$args{output}, param => {session_id => $args{session_id}}, );
このようにすることでhref
属性に「&session_id=**************(*はセッションID)」というパラメータが付加されます。
これでリンクによる遷移時にセッションを維持できるようになりました。
フォームによる遷移
フォームで遷移する場合はフォームタグ内にhiddenでセッションIDを送るためのinput
タグを埋め込みます。その処理を行っているのがサンプルのhidden_session_id()
という関数です。
画面表示前にHTMLを解析し、HTML内のフォーム内にinput
タグを埋め込んでいます。
## セッションIDを hidden を使用して画面に埋め込む $args{output} =~ s/(<form\s*.*?>)/$1\n<input type="hidden" name="session_id" value="$args{session_id}">/isg;
これでフォームによる遷移時にもセッションを維持できるようになりました。
リダイレクトによる遷移
最後がリダイレクトによる遷移です。
リダイレクトする場合はリダイレクトするURLにセッションIDを付加する必要があります。サンプルではdo_exec()
という関数内でその処理を行っています。
## リダイレクト先のURLにセッションIDを付加する my $url = sprintf q{index.cgi?session_id=%s}, $session->id; print $q->redirect( $url );
以上で、リンク、フォーム、リダイレクトそれぞれでセッションを維持できるようになりました。
まとめ
モバイル用のWebアプリケーションでのセッションを管理する方法を紹介させていただきました。
今まで携帯でセッションを扱ったことのない方も、本稿を参考にしてちょっと凝ったWebアプリケーションを開発してみてはいかがでしょうか。