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 이벤트가 발생합니다.
void OnCommandGet(TIdContext *AContext, TIdHTTPRequestInfo *ARequestInfo,
TIdHTTPResponseInfo *AResponseInfo)
{
if (ARequestInfo->Document == "/")
{
AResponseInfo->ServeFile(AContext, "yourpathhere\\index.html");
}
else
{
// check if user is valid
if (((ARequestInfo->AuthUsername == "user") && (ARequestInfo->AuthPassword == "pass")) == false)
{
AResponseInfo->AuthRealm = "Authenticate";
}
else
{
// create a new session id with authentication data
string vID = ARequestInfo->AuthUsername + "_" + ARequestInfo->AuthPassword + "_" + ARequestInfo->RemoteIP;
// search session
TIdHTTPSession oSession = TsgcWebSocketHTTPServer1->SessionList->GetSession(vID, ARequestInfo->RemoteIP);
// create new session if not exists
if (oSession == NULL)
{
oSession = TsgcWebSocketHTTPServer1->SessionList->CreateSession(ARequestInfo->RemoteIP, vID);
}
AResponseInfo->ContentText = "<html><head></head><body>Authenticated</body></html>";
AResponseInfo->ResponseNo = 200;
}
}
}