2016-01-29 1 views
0

Я пытаюсь реализовать менеджер сеансов веб-сокета, и я только что столкнулся с дорожным блоком, который, я надеюсь, кто-то может мне помочь.Управление и идентификация webcocket Tomcat

В основном клиент инициирует сеанс веб-сокета с моей конечной точкой сервера websocket, и я буду принимать параметры HTTP-запроса, проанализировать его и подписаться на конечную точку производителя веб-сервиса. Веб-служба вернет ответ, содержащий идентификатор подписки, который будет использоваться в качестве сопоставления клавиш (вместе с идентификатором сеанса HTTP), чтобы добавить к кешу Java-карты с объектом сеанса. Продолжайте отправлять данные в мою опубликованную конечную точку webservice. Затем мое приложение берет данные, полученные от производителя, использует идентификатор подписки, который поставляется с каждым пакетом, и находит правильный сеанс в кэшах карты для отправки данных обратно.

Вот моя проблема ..

Я заметил, что, если клиент открывает другую вкладку в браузере и посылает второй запрос на подписку, он все равно будет отправлен с тем же HTTP Session ID еще кот по-прежнему будет иметь возможность для передачи данных на правильную вкладку. Это означает, что реализация webcocket tomcat имеет встроенный механизм мультиплексной обработки.

Чтобы исключить некоторые ненужные данные, если не указано иное, я хочу также иметь возможность идентифицировать все каналы, которые были мультиплексированы под одним и тем же идентификатором сеанса. Но я не могу найти никакого способа в API, чтобы идентифицировать его. Поскольку мне нужно иметь возможность искать мои кеши карт и удалять сеансы для закрытых вкладок (что вызывает метод close в моей конечной точке веб-сокета), но я не смогу это сделать, поскольку может быть многие сокеты/каналы, связанные с тем же идентификатором сеанса HTTP.

+0

не мультиплекс - это просто, что каждая вкладка открывает новый веб-узел. они действительно используют один и тот же сеанс, потому что отправляется тот же файл cookie. Вы можете использовать счетчик ссылок - сколько веб-узлов открыто для сеанса. если он достигает 0, вы можете выполнить некоторую работу по очистке. – ZhongYu

+0

Прежде всего, этот счетчик ссылок вы говорите о session.getId()? Спасибо за ваш ответ – ron

+0

вы можете сохранить карту 'session id -> количество открытых веб-сайтов'. увеличить число, когда ws открыто; уменьшите его, когда ws будет закрыто. он должен быть потокобезопасным. – ZhongYu

ответ

0

Рамка websocket не предусматривает такой реализации. Каждая вкладка открывает новый сокет. Вы можете поддерживать информацию о сеансе посредством добавления ключа в запрос при запуске websocket и при проверке сообщения для этого ключа (например, значения идентификатора JSESSION) на сервере и соответственно обслуживать запрос.