セッション(接続状態)の保持 - たった一度だけの関係?
一番最初でも書きましたが、ホームページは要求に対して返信という命令の繰返しで成り立っている仕組みです。つまり、常に通信している状態というのを管理できません。わかりやすく書くと、誰がホームページをクリックしたかという情報はクリックしたそのとき限りしか感知しない、ということです。
自分は同じサーバー内のAというページからBというページにリンクにより移動したとします。自分のパソコンやブラウザは自分がそのようにページを移動したことを覚えていますが、要求を受け付けて応答しているサーバーはAのリクエストもBのリクエストも「誰が」という状態を全く管理していないのです。
これはHTTPというプロトコルの仕様なのですが、パソコン(クライアント)から要求があって、その応答をサーバーがする過程では、そのとき一度限りの関係でしかないのです。これがどのように問題になるのでしょうか?
一番簡単な例でたとえるなら、、、
掲示板のプログラムで、初期設定を発言の最新から10件表示としていたとします。当然、次の11~20を見るためには都度11~20のデータがほしい、戻る場合も1~10のデータがほしいという情報を送信する必要があるのです。自分が今1~10のデータを見ていたとしても、そのことはサーバー側では全く感知しません。
もっと重要な例でいうなら、パスワードで制限されたページを考えてみてください。最初にユーザID&パスワードを入力して認証されれば最初のページが表示されますが、利用者がその保護されたページを移動するためには、都度、その利用者がその人であることを教えてやる必要があるのです。
ステートレス型通信の特徴
このあたりの、一つのアクションに対する応用の仕方がスタンドアローンでプログラムを書く場合との最大の違いになるのです。(これをステートレス型といいます。ステートレスとは状態がない、、、つまり状態を管理しないということです。)
スタンドアローン形のプログラムの例で言うなら、一度なにかの処理をするごとにそのプログラムを終了しているのと同じことです。毎回終了しているので、その続きの処理をさせるのには、毎回そこまでのデータを教える必要がある、ということと同じになります。
inputタグのhidden属性で状態を伝える(一例として)
一連の処理で画面が次々と変わっていく(遷移していく)場合には、それらが継続していることをサーバーに伝える必要があるということは、先ほどの記述で理解していただけた(?)と思っていはいるのですが、では、サーバー側でその連続性を認識できない(セッションが確立されない)なら、どのようにしてそれおを実現するか、という問題が発生します。
その一例としてあげられるのが、INPUTタグのhidden属性を利用する方法です。では、今回もサンプルで考えてみましょう。
まず、ユーザー登録(懸賞応募など)のプログラムを考えてみたいと思います。下のような流れで画面は移っていきますよね?
画面遷移
1・情報入力画面
↓
2・情報確認画面
↓
3・送信終了画面
通常このようなデータを受け付ける場合の画面遷移を考えた場合、1番だけの入力画面で終わるケースはまれですし、入力している利用者側にも不安を与えかねません。
そこで、2番目のプロセスのように、入力させてその情報を再度確認させる画面を表示し、そこで送信(登録)終了後に、ただしく処理された旨の確認画面を出す、という流れになっています。
1で入力された情報を再度確認のために2に表示するのはこれまでのプログラム処理と同じなのですが、その情報を最後にサーバーに書き込むという処理の場合にも、2から3に移動するときに、1で入力された同じ情報を再度、利用者の端末側から送り込む必要があるのです。(1で情報を入力され、2で表示した段階で、サーバーはその情報を全く覚えていません。)
よって、プログラム内では、1で入力された内容の必要なものを確認画面のためにHTMLで書き出すと同時に、再度サーバーに送り込むための準備をする必要があるのです。そのために、1で入力された内容を再度INPUTタグにHIDDENとして書き込む必要があるのです。(面倒ですが、ステートレスであることがHTTPというプロトコルの仕様なので、仕方がありません)
このような処理は今回に限らず、状態を維持しながらページを表示したい場合には、「自分が今どのような状態なのかのすべて」を「毎回」サーバーに教える必要があります。
hidden属性でのセッション保持のサンプル
ちなみに、上で解説した入力画面の例を理解してもらうために、サンプルをつくりました。下をクリックすると、別窓が開きます。(今回はhidden属性の使い方になるので、サンプルソースはありません。)
その他の実装方法 - Cookieでセッションの保持
HTML内にhidden属性を利用する方法以外にCookieを使う方法もあります。Cookieを利用すれば、hidden属性を利用するのと同様に、そのパソコンのデータをサーバーとの間でやり取りできます。また、INPUTタグを利用するのと違い、HTMLにデータを書き出すことが不要です。(そのかわりCookieを読み書きするための処理が必要ですが、、、)
ただし、Cookieは利用者のパソコンで利用不可としていることもあるため、Cookieを使えるようにしていないとこの方法は使えません。
どちらの方法がいいかという点については一長一短ありますし、これはユーザーパスワード等を使ったページの保護を考える場合にも必要となってきますので、別途検討したいと思います。具体的には、ユーザーパスワードを求めるようなページを作った場合、セッションの維持をするために、CookieやHidden属性に生のパスワードを埋め込むか、それともセッションIDのような数値を生成するか、、、というちょっと奥の深い話になってしまいます。
今回はとりあえず、状態保持には都度情報を送信する必要がある、ということを理解してもらえればOKだと思います。





