HTTP 세션과 CometD 세션의 수명주기가 다릅니다. 예를 들어 임시 연결에 실패하면 CometD 세션이 실패하고 서버가 클라이언트에게 다시 핸드 셰이크하도록 요청하여 다른 CometD 세션 (동일한 사용자를 나타내지 만 다른 CometD가 clientId
인 세션). 같은 경우에 HttpSession
은 그대로 유지됩니다.
이 점을 염두에두면 사용자 이름 인 HttpSession
과 해당 ServerSession
사이의 매핑을 응용 프로그램 수준에서 유지 관리해야합니다. 이 매핑을 HttpCometDMapper
이라고합시다. 새 사용자가 로그인 할 때마다 이름 (또는 사용자의 다른 고유 한 식별자) 인 HttpSession
과 현재 ServerSession
을 등록합니다. 두 단계 프로세스가 필요합니다. 사용자 이름과 HttpSession
을 먼저 연결 한 다음 ServerSession
과 동일한 사용자 이름을 연결해야합니다.
CometD 재 핸드 쉐이크가 수행되면 매퍼를 새로운 ServerSession
으로 업데이트합니다.
당신은 그래서 파괴 때, 당신은 매퍼에서 현재 CometD ServerSession
를 검색하고 그 위에 ServerSession.disconnect()
를 호출하는 HttpSession
에 HttpSessionListener
를 등록하여 두 개의 세션을 연결할 수 있습니다.
CometD에는 HttpSession
과 같은 비활성 시간 제한 개념이 없기 때문에 viceversa가 약간 까다 롭습니다. 그것은 당신 자신의 논리로 응용 프로그램에서 구현되어야합니다.
한 그 일의 부분은 그처럼 ServerSession
에 RemoveListener
를 등록하는 것입니다
serverSession.addListener(new ServerSession.RemoveListener()
{
public void removed(ServerSession session, boolean timeout);
{
if (!timeout)
{
// Explicitly disconnected, invalidate the HttpSession
httpCometDMapper.invalidate(session);
}
}
});
이 청취자는 명시 적으로 클라이언트에서 연결을 끊습니다 (서버 - 재진입 조심) 감시합니다.
비 명시 적 연결 해제에 대해 동일한 메커니즘을 구현하는 것이 다소 어렵습니다.이 경우 timeout
매개 변수는 true이지만 일시적인 네트워크 오류 (클라이언트가 정상적으로 사라지는 것과 반대 됨)로 인해 발생할 수 있으며 동일한 사용자가 이미 ServerSession
으로 다시 핸드 셰이크 할 수 있습니다.
이 경우 응용 프로그램 시간 초과가 문제를 해결할 수 있다고 생각합니다. 시간 제한으로 인해 ServerSession
이 제거 된 것을 볼 때 해당 사용자를 기록하고 응용 프로그램 시간 초과를 시작합니다. 동일한 사용자가 다시 핸드 셰이크하면 응용 프로그램 시간 초과를 취소합니다. 그렇지 않으면 사용자가 실제로 사라지고 응용 프로그램 제한 시간이 만료되며 HttpSession
도 무효화됩니다.
위의 내용은 아이디어와 제안 일뿐입니다. 실제 구현은 애플리케이션 세부 사항에 크게 의존합니다 (CometD가 제공하지 않는 이유입니다).
핵심 포인트는 매퍼 인 HttpSessionListener
과 RemoveListener
이며 이러한 구성 요소의 수명주기를 알고 있습니다. 일단 관리하면 애플리케이션에 적합한 코드를 작성할 수 있습니다.
마지막으로, CometD는 에서 얻을 수있는 BayeuxContext
인스턴스를 통해 HttpSession
과 상호 작용할 수있는 전송 불가시 방법을 가지고 있습니다. 나는 이것을보고 단순화 할 수 있는지, 특히 HttpSession
에 저장된 토큰을 검색하는 것이 좋습니다.