こちら で記述したCGIセッションのサンプルです。
あくまで一例ですので、いろいろ遊んで感じがつかめたらもっと実践的な安全性の高いプログラムにしましょう。
Cookieクラス、CgiSessionクラスやSaveDataはファイルの方を参照ください。
ファイルのダウンロードはこちら 。
【CGIセッションのサンプルmain】
#include <cstdlib>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <direct.h>
#include "boost/io/ios_state.hpp"
#include "SaveData.h"
#include "Cookie.h"
#include "CgiSession.h"
using namespace std;
using namespace nana;
bool exec()
{
char* env = getenv("HTTP_COOKIE");
string str = (env==NULL? "": env);
//クッキーマップを取得する
SaveDataMap cmap;
loadCookie(cmap, str);
//セッションIDを取得する
CgiSession session(cmap["sessId"]);
session.load();
if(session.getId().empty()){
cout << "Content-type: text/html" << "\n" << endl << "session error has occured.";
return false;
}
//セッションデータを更新
session.saveMap["cnt"] += 'c';
session.saveMap["buy"] = "買ったもの";
session.save();
//クッキーデータを送信
Cookie cookie("sessId", session.getId());
cout << cookie << "\n";
cout << "Content-type: text/html\n" << endl;
cout << "<html><body>" << session.saveMap["cnt"] << ":"
<< ctime(&session.getSessionTime()) << (session.isTimeout() ? "true":"false")
<< "</body></html>\n" << endl;
return true;
};
int main(int argc, char *argv[])
{
if(!exec()){
system("PAUSE");
return EXIT_FAILURE;
}
system("PAUSE");
return EXIT_SUCCESS;
}
※サンプルをコンパイルしたexeは、「C:\httpd\cgi-bin\test\session.exe」などに保存してください。
http://localhost/cgi-bin/test/session.exeでアクセスできます。
【説明】
このWEBにアクセスするたびに、cという文字が連結されて行きます。
どんどんcが増えるので、1つ前のセッションデータが保存されているのが分かると思います。
詳しくは、以下をお読みください。
Cookieクラス ⇒ クッキーとは? を参照。
CgiSessionクラス ⇒ こちら を参照。
SaveData ⇒ 入出力ストリームをイテレータで扱うには?
を参照。
【CGIセッションファイルの削除のサンプル】
サンプルは上記のサンプルのダウンロードファイルのdelete_sessionフォルダに入っています。
このサンプルには、以下のBoostのソースが必要です。
error_code.cpp
operations.cpp
path.cpp
Boostがインストールされていれば存在しますので、検索して同じフォルダにコピーして
コンパイルしてみてください。
もしくは、ライブラリをリンクすれば大丈夫です。
参考:
・Boostとは?