TsgcWebSocketHTTPServer | Sessions

HTTP, durumsuz (stateless) bir protokoldür (en azından HTTP 1.1'e kadar), bu yüzden istemci bir dosya ister, sunucu bir yanıt gönderir ve bağlantı kapatılır (bağlantının hemen kapatılmaması için keep-alive'ı etkinleştirebilirsiniz, ancak bu, bu makalenin kapsamı dışındadır). Oturumlar, istemci hakkında bilgi saklamanıza olanak tanır; bu, örneğin bir istemci oturum açması sırasında kullanılabilir. Herhangi bir benzersiz oturum ID'si kullanabilir, birinin zaten var olup olmadığını görmek için oturum listesini arayabilir ve yoksa yeni bir oturum oluşturabilirsiniz. Bir oturum, bir etkinlik dışı süreden sonra veya istemci oturumu kapattıktan sonra manuel olarak yok edilebilir.

 

Configuration

TsgcWebSocketHTTPServer'da sunucu bileşenindeki oturumları etkinleştiren/devre dışı bırakan bazı özellikler vardır. En önemlileri şunlardır:

 

Özellik Açıklama
SessionState Bu, Oturumları kullanmak için etkinleştirilmesi gereken ilk özelliktir. Bu özellik etkinleştirilmeden oturumlar çalışmaz

SessionTimeout

Burada bir oturumun etkin kalacağı maksimum süre için sıfırdan büyük bir değer (milisaniye cinsinden) ayarlamalısınız.
AutoStartSession Oturumlar otomatik olarak (AutoStartSession = true) veya manuel olarak (AutoStartSession = false) oluşturulabilir. Oturumlar otomatik olarak oluşturulursa, sunucu, saklanan etkin bir oturum olup olmadığını kontrol etmek için benzersiz bir tanımlayıcı olarak RemoteIP'yi kullanır.

 

 


TsgcWebSocketHTTPServer1.SessionState := True;
TsgcWebSocketHTTPServer1.SessionTimeout := 600000;
AutoStartSession := False;

 

Create Session

Yeni bir oturum oluşturmak için, benzersiz olan yeni bir session ID oluşturmanız gerekir. Herhangi bir değer kullanabilirsiniz. Örnek: istemci kimlik doğruluyorsa, session ID olarak user + password + remoteip kullanabilirsiniz.

Ardından, zaten var olup olmadığını kontrol etmek için oturum listesini arayın. Yoksa, yeni bir tane oluşturun.

 

Yeni bir oturum oluşturulduğunda OnSessionStart olayı çağrılır ve oturum kapatıldığında, OnSessionEnd olayı tetiklenir.

 


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;