Как добавить ограничение на доступ к хосту, не более одного подключения единовременно? Стек dotnet + js
Делаю тестовое задание на стеке Web API
+ NextTS
.
Одно из условий звучит так:
"если у одного пользователя в браузере открыт сайт, то второму пользователю в другом браузере показывать сообщение вида 'Извините, сайт занят'".
Т.к. всё происходит локально, то задание, видимо, надо понимать как
"реализовать невозможность открыть в браузере адрес http://localhost:3000/
, если он уже открыт в другой вкладке".
Как это сделать?
Ответы (1 шт):
Автор решения: Solt
→ Ссылка
Стек П/О в принципе не важен. Надо решить ряд следующих задач:
Идентификация клиента.
Возможные решения:
- куки. Либо сервер должен посмотреть в запросе какую-нибудь куку, если её нет - передать уникальную и в следующий раз её проверять. Либо сгенерировать уникальный идентификатор на клиенте в JS, и сохранив локально, передавать его либо в виде куки, либо параметром во все запросы.
- Basic-авторизация. Сервер должен проверить наличие HTTP-заголовков с basic-авторизацией, если нет выдавать 401 и ждать когда клиент их передаст. На основании авторизации считать абонета уникальным. Этот вариант хуже тем, что с двух мест можно заполнить одинаково, отличий не будет.
Проверка клиента онлайн
Открытый в браузере сайт никаким образом серверу не виден. Решений два:
- Периодическая отправка AJAX-запросов на сервер, дабы он знал, что абонент жив. При этом сервер должен сам следить за тайм-аутом сессии и, если запросов нет, отсчитывать тайм-аут, а если есть - обнулять таймер. Плюсы - легко реализовать. Минусы - либо большой трафик, либо большой таймаут. Частичное решение - при покидании сайта можно пытаться отправить запрос с сообщением, что клиент ушёл, освобождая сессию.
- Websocket-сервер. Нужен отдельный вебсокет-сервер, поддерживающий постоянные соединения, с которым веб-сервер сможет обмениваться информацией. Клиент же должен из JS к нему подключиться и висеть онлайн. Плюсы - отсутствие лишнего трафика и возможность обойтись без идентификации сессии. Минусы - более сложная реализация. Желательное условие - реализация сайта в виде одностраничного приложения (SPA) для исключения переподключений к WS. Иначе во-первых при переходах может самого себя заблочить из-за задержек работы WS-сервера, либо в этот момент подключится другой клиент.