HTTPはステートレスプロトコルです(少なくともHTTP 1.1まで)。クライアントはファイルをリクエストし、サーバーはレスポンスを送信し、接続が閉じられます(keep-aliveを有効にすることで接続が即座に閉じられないようにできますが、これはこの記事の範囲外です)。セッションを使用すると、クライアントに関する情報を保存できます。例えば、クライアントのログイン時に使用できます。任意の一意のセッションIDを使用し、セッションリストを検索して既存のセッションがあるかどうかを確認し、なければ新しいセッションを作成できます。セッションは一定期間の非アクティブ後に破棄するか、クライアントのログアウト後に手動で破棄できます。
TsgcWebSocketHTTPServerには、サーバーコンポーネントでセッションを有効/無効にするいくつかのプロパティがあります。最も重要なものは次のとおりです。
| プロパティ | 説明 |
| SessionState | Tこれはセッションを使用するために最初に有効にする必要があるプロパティです。このプロパティが有効になっていない場合、セッションは機能しません。 |
|
SessionTimeout |
ここでは、セッションがアクティブになる最大時間(ミリ秒)としてゼロより大きい値を設定する必要があります。 |
| AutoStartSession | セッションは自動的に作成(AutoStartSession = true)または手動で作成(AutoStartSession = false)できます。セッションが自動的に作成される場合、サーバーはアクティブなセッションが格納されているかどうかを確認するために RemoteIP を一意識別子として使用します。 |
TsgcWebSocketHTTPServer1.SessionState := True;
TsgcWebSocketHTTPServer1.SessionTimeout := 600000;
AutoStartSession := False;
新しいセッションを作成するには、一意の新しいセッション ID を作成する必要があります。任意の値を使用できます。使用例: クライアントが認証する場合、セッション ID としてユーザー名 + パスワード + リモート IP を使用できます。
次に、セッションリストを検索してすでに存在するか確認します。存在しない場合は新しいセッションを作成します。
新しいセッションが作成されると OnSessionStart イベントが呼び出され、セッションが閉じられると OnSessionEnd イベントが発生します。
procedure OnCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo;
AResponseInfo: TIdHTTPResponseInfo);
var
vID: String;
oSession: TIdHTTPSession;
begin
if ARequestInfo.Document = '/' then
AResponseInfo.ServeFile(AContext, 'yourpathhere\index.html')
else
begin
// check if user is valid
if not ((ARequestInfo.AuthUsername = 'user') and (ARequestInfo.AuthPassword = 'pass')) then
AResponseInfo.AuthRealm := 'Authenticate'
else
begin
// create a new session id with authentication data
vID := ARequestInfo.AuthUsername + '_' + ARequestInfo.AuthPassword + '_' + ARequestInfo.RemoteIP;
// search session
oSession := TsgcWebSocketHTTPServer1.SessionList.GetSession(vID, ARequestInfo.RemoteIP);
// create new session if not exists
if not Assigned(oSession) then
oSession := TsgcWebSocketHTTPServer1.SessionList.CreateSession(ARequestInfo.RemoteIP, vID);
AResponseInfo.ContentText := '<html><head></head><body>Authenticated</body></html>';
AResponseInfo.ResponseNo := 200;
end;
end;
end;