CORBA точно не определяет понятие «клиент», потому что оно имеет несколько значений для разных людей:
- Компьютер клиента (идентифицируемый по IP-адресу)
- Сетевая карта, которую клиент использовал для подключения к серверу (определяется по MAC-адресу)
- Процесс клиента (определяется по идентификатору процесса)
- Сокет клиента для подключения ксервер (идентифицируется дескриптором файла)
- ORB внутри этого процесса (идентифицируется идентификатором ORB, который может быть передан
ORB::init()
) - Поток внутри процесса, выполняющий вызов (идентифицированпо идентификатору потока)
Сложность заключается в том, что некоторые из этих элементов (особенно идентификация на основе соединений) не могут надежно использоваться в CORBA для идентификации клиентов или отслеживания их срока службы, поскольку разрешены ORBзакрыть незанятые соединения, а затем восстановить их после возобновления активности.
Лучший способ справиться с этой проблемой - внедрить управление временем жизни клиента в ваше приложение и, в частности, в вашу IDL.Попросите клиента запрашивать файл cookie во время «подключения» и передавать этот файл cookie в каждом последующем запросе:
interface Foo {
void connect(out string cookie) throws AlreadyConnected;
void doWork(in float data, in string cookie) throws NotConnected;
void disconnect(in string cookie) throws NotConnected;
};
Мой синтаксис IDL может быть не идеальным, но вы поймете идею.Вам также следует изучить способы прозрачной отправки cookie без необходимости воздействия на вашу IDL с использованием PortableInterceptors и / или Контекстов обслуживания .
Независимо от того, как вы передаете куки или токен сеанса, вашему серверу придется тщательно управлять ими и, при необходимости, удалять старые.Управление сессионными cookie-файлами может быть реальным бременем для службы и препятствовать его способности хорошо масштабироваться.