WEBを作りたいと思えば、セッションを使いたくなりますよね?
Java、ASPなどではセッションクラスがあり、値をセッションごとに保存したり書き変えられますよね?
でも、C++には当然そんな機能はありません!!
ふー。
そんなわけで頑張らないといけません。
今までの知識があればそれほど難しくはありません。
ここでは、一般的なやり方のみ記述しようかと思います。
【セッション実現の手順】
①クライアントごとにセッションIDを発行します。
なんでも良いのですがここでは、time()と乱数rand()を使用して32桁の16進数を使用して以下のような
IDを発行しましょう。
438915546AC9E9E4332465E79179234C
②データをWEBサーバに保存します。
①のセッションIDとセッションのデータと現在時刻を組にしてWEBサーバにデータを保存します。
DBを使用しても良いですし、ファイルに保存しても良いです。
ここでは、ファイル名をセッションIDにして、データをファイルに保存しましょう。
③クッキーを発行して、クライアントにセッションIDを保存します。
クッキーについては、クッキーとは? を読んでいただければ分かるかと思います。
HTTPヘッダの出力例は、以下のような感じです。
Set-Cookie: sessId=438915546AC9E9E4332465E79179234C;
Content-type: text/html
<html><body>何かHTMLを・・・・</body></html>
ログインを必要とするWEBは、上記のようにセッションクッキーにした方がよいです。
IEを閉じたときにクッキーが無効になるからです。
ここのアメブロのようにIEを閉じたあとでも、次回IEを立ち上げたときにID/PWを入れずに
そのままログインできるようにするにはExpiresを設定します。
④IEがWEBサーバに送ってきたクッキーからセッションIDを取得します。
クッキーの取得方法は、getenv("HTTP_COOKIE")を使用し、クッキー文字列を取得します。
クッキー文字列は、クッキーとは? を参考にして分解しましょう。
⑤④で取得したセッションIDと同じファイル名を②で保存したファイルから検索して、セッションデータを
読み込みます。
⑥セッションの有効時間をつける場合:
②で保存した現在時刻から30分以上経っているときはセッションデータをクリアします。
⑦②のファイルを削除します。(バッチなどで定期的に)
保存先のディレクトリ内のファイルをすべて走査して、保存した現在時刻から一定時間以上経過している
セッション用のファイルを削除します。
こうしないと、WEBサーバにファイルが増え続けることになり、ハードディスクを圧迫するからです。
これで、セッションが実現できますね!
【補足】
セッションデータのファイルへの保存には、入出力ストリームをイテレータで扱うには? を参考にすればできます。(というかそのままです)
あと、クッキー出力には、それ用のクラスを作っておいた方が、後々便利です。
サンプルとしては以下のリンクような感じになると思います。
【注意点】
WEBでは、設定ファイルや上記のようなセッションデータ用のファイルを閲覧できる位置に置いてはいけません。
具体的にはAN HTTPの場合、「C:\httpd\」配下のサブディレクトリにおかないことです。
出力場所は、「c:\cgi\test」など他の場所にディレクトリを作ってそこに置きましょう!
なぜなら、「C:\httpd\」配下すべては、URLに「../」などを入れれば閲覧される可能性があるからです。
ApacheやIIS,AN HTTPの設定で、ある拡張子しかアクセスできないようにすることはできるはずですが、
バグがあれば見えてしまう可能性もあります。
より安全性を目指すなら、WEBと無関係な箇所に置きましょう。
参考: