minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

「セッションって何?」って話については、他のページに譲ることにします。
ここでは、携帯からセッション管理する方法について説明します。

なお、セッションを使うにはHTMLだけでは無理です。
PHP/Perl/JavaServlet等、何らかのCGIを用いる必要があります。

通常のサイトでは、セッション情報は一時クッキーを用いて実現します。
しかし前述したように携帯ではクッキーが使えないので
別の方法でセッション管理をする必要があります。

それは、URLにセッション情報(ID)を埋め込む方法です。
これによって、確実にセッション管理を行うことが出来ます。

Java Servletでの簡単な例

最も一般的な形で説明します。
ここではコンテナとしてTomcatを使用しますが、他のものでも同様の処理が可能なはずです。

index.html(トップページ)
|
`--> login.cgi(ログイン処理)
     |
     |--> member1.jsp(メンバー画面1)
     |--> member2.jsp(メンバー画面2)
     `--> ...

トップページでユーザIDとパスワード等を入力して
その後メンバー画面に遷移するようなパターンです。
メンバー画面は複数存在可能で、その間中セッション管理をすることにより
現在アクセスしているユーザを判断することが可能になります。

もし仮に誰かが直接メンバー画面に遷移しようとした場合、
セッション情報が存在しなければトップページに飛ばす等の対処をします。

ログイン時の処理

トップページでログインボタンを押すと、サーバ側では認証処理を行います。
ここで認証が失敗すると、セッションは作成せずにトップページに飛ばします。
リダイレクトすることにより、セッションは強制的に切断されます。

response.sendRedirect("index.html");

認証が成功した場合、セッションを作成します。

HttpSession session = request.getSession();

getSession() でセッションが作成されるっていうのもなんか変ですが。
セッションを作成すると、そのセッションには
「セッションID」というものが振られます。
これにより、現在どのユーザがアクセスしているかを判断するわけです。

セッションを作成したら、そこに「認証に成功したよ」という証を付けましょう。

session.setAttribute("login", "on");

なんて適当な(笑)。でも大抵の場合、これでいいのです。
セッション情報というのはサーバ側で管理しますので、
悪意あるユーザが勝手に作成することは出来ません。
つまり、サーバが動いているマシンのJavaVMがハックされない限り大丈夫です。
逆に、

session.setAttribute("password", password);

のように情報を詰めてしまう方がかえって危険です。
うっかりこの情報を外部に出してしまう可能性が無いとは言えませんよね。

URLへセッションIDの付加

さて、ここまで来たらもう準備は万端です。
認証に成功したら、メンバー画面に遷移させます。

request.getRequestDispatcher("member1.jsp");

これで、画面1が表示されます。

member1.jsp

...
<a href="member2.jsp"></a>
...

画面1の中に、画面2へのリンクが存在します。
こういった場合、通常ならばこのままリンクを辿るだけで
セッション情報というのは維持されるのですが
先程も話したようにそれは「一時クッキー」というものが内部的に使われているからです。
これが使えない場合、明示的にセッション情報を記述する必要があります。

member1.jsp

...
<a href="member2.jsp;jsessionid=<%= request.getRequestedSessionId() %>">Page2</a>
...

こんな感じで、jsessionid=XXX という表記により
明示的にセッションIDを指定します。
クエリー文字列を使用する場合は

member2.jsp;jsessionid=XXX?key=value

のように、クエリー文字列の前にセッションIDを記述します。

これで、携帯端末でもセッションが使えるようになります。
jsessionidは、全てのリンクおよびSUBMIT先に付加する必要があります。

Velocityの場合

さて、上のJSPを見て「なんだか汚いコードだなぁ」と思ったあなた。
なかなかセンスがいいですね(笑)。
僕から言わせれば、HTML内にJavaロジックを埋め込むなど愚の骨頂です。
だったらPHPでも使った方がよっぽどいいと思います。

参考ページ : Velocityのススメ

Velocityを使って書くと、以下のようになります。

Servlet側

context.put("JSESSIONID", request.getRequestedSessionId());

HTML(vm)側

<a href="member2.jsp${JSESSIONID}">Page2</a>

このように、サーバ側で値を格納し
VM(jspのようなもの)側でその値を表示するというシンプルな作りです。