TsgcWebSocketHTTPServer | Sessions

HTTP는 무상태 프로토콜입니다(적어도 HTTP 1.1까지). 따라서 클라이언트가 파일을 요청하면 서버가 응답을 보내고 연결이 닫힙니다(연결이 즉시 닫히지 않도록 keep-alive를 활성화할 수 있지만 이는 이 문서의 범위를 벗어납니다). 세션을 사용하면 클라이언트에 대한 정보를 저장할 수 있으며, 예를 들어 클라이언트 로그인 중에 사용할 수 있습니다. 고유한 세션 ID를 사용하고 세션 목록을 검색하여 이미 존재하는지 확인한 다음, 없으면 새 세션을 생성할 수 있습니다. 세션은 비활성 기간 후 또는 클라이언트 로그아웃 후 수동으로 소멸될 수 있습니다.

 

구성

TsgcWebSocketHTTPServer에는 서버 구성 요소에서 세션을 활성화/비활성화하는 일부 속성이 있습니다. 가장 중요한 것은 다음과 같습니다:

 

속성 설명
SessionState T이것은 Session을 사용하기 위해 활성화해야 하는 첫 번째 속성입니다. 이 속성을 활성화하지 않으면 세션이 작동하지 않습니다

SessionTimeout

여기에 세션이 활성화될 최대 시간에 대해 0보다 큰 값(밀리초)을 설정해야 합니다.
AutoStartSession 세션은 자동으로(AutoStartSession = true) 또는 수동으로(AutoStartSession = false) 생성할 수 있습니다. 세션이 자동으로 생성되면, 서버는 RemoteIP를 고유 식별자로 사용하여 저장된 활성 세션이 있는지 확인합니다.

 

 


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

 

세션 생성

새 세션을 생성하려면 고유한session ID를 생성해야 합니다. 어떤 값이든 사용할 수 있습니다. 예: 클라이언트가 인증 중인 경우, user + password + remoteip를 session ID로 사용할 수 있습니다.

그런 다음 세션 목록을 검색하여 이미 존재하는지 확인하십시오. 존재하지 않으면 새로 생성하십시오.

 

새 세션이 생성되면 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;