サーバー側セッション管理
DataSnap アプリケーションの開発 への移動
クライアントが DataSnap サーバーに接続すると、セッションが作成されます。このセッションは、TDSSession またはそのサブクラスのインスタンスで表されます。TDSAuthSession クラスは、TDSSession を拡張したもので、それ自体もサブクラスを持ちます(TDSRESTSession、TDSTCPSession、TDSTunnelSession)。これらのインスタンスは、TDSCustomAuthenticationManager のインスタンスを保持しているため、権限付与のチェックを行うことができます。
目次
セッションのライフサイクル
SessionTimeout の設定
DataSnap サーバーへの TCP または HTTP による TSQLConnection の場合は、接続が閉じたときにのみセッションが終了します。TDSRESTConnection の場合は、TDSHTTPServerTransport クラスか TDSHTTPServer クラスのどちらかで公開されている SessionTimeout プロパティによって、セッションの存続期間を制御することができます。たとえば、TDSHTTPService コンポーネントではこのプロパティを公開していますし、TDSHTTPWebDispatcher でも同様です。値はミリ秒単位で設定され、セッションが使用されないままどれだけの時間が経過すればセッションの有効期限が切れるかを表します。クライアントがセッション ID を指定してサーバーに要求を発行するたびに、セッションはその時点でアクティブとされ、セッションの有効期限を示すクロックがリセットされます。
セッションのクローズ
セッションを閉じるには、SessionId(実際には TDSSession.Name)を知っている必要があります。セッションを閉じるには、次のような呼び出しを行います。
TDSSessionManager.Instance.CloseSession(SessionId);
現在のスレッドのセッションの取得
たとえばサーバー メソッドから、現在のスレッドのセッションを取得することができます。これは、現在の要求を発行しているユーザーについての有益な情報となります。それには、次のコードを使用します。
Session := TDSSessionManager.GetThreadSession;
セッションの作成およびセッションの有効期限切れのリスン
イベントを TDSSessionManager に登録することで、新しいセッションが作成されたり古いセッションの有効期限が切れた場合に TDSSessionManager に通知を送ることができます。それには、次のコードを使用します。
TDSSessionManager.Instance.AddSessionEvent( procedure(Sender: TObject; const EventType: TDSSessionEventType; const Session: TDSSession) begin case EventType of SessionCreate: {The provided Session was just created.} SessionClose: {The provided Session has just been closed, either intentionally or it has expired.} end; end);
後でそのイベントを削除したい場合には、フィールドに格納しておき、後で RemoveSessionEvent を呼び出して、イベントをパラメータとして渡します。
セッション データ
セッションに含まれるデータを格納することができます。データは、キーと値のペア(キーも値も文字列)として格納されます。
データの格納
セッション内のデータを格納するには、PutData を呼び出して、格納したいキーと値を渡します。
データの取得
特定のキーに対応する値が存在するかを確認するには、HasData を呼び出します。値を取得するには、GetData を呼び出し、パラメータとしてキーを渡します。
データの削除
格納したキーと値のペアをセッション データから消去するには、RemoveData を呼び出し、パラメータとしてキーを渡します。