TsgcWebSocketHTTPServer | セッション

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;