Как добавить ограничение на доступ к хосту, не более одного подключения единовременно? Стек dotnet + js

Делаю тестовое задание на стеке Web API + NextTS. Одно из условий звучит так: "если у одного пользователя в браузере открыт сайт, то второму пользователю в другом браузере показывать сообщение вида 'Извините, сайт занят'".

Т.к. всё происходит локально, то задание, видимо, надо понимать как "реализовать невозможность открыть в браузере адрес http://localhost:3000/, если он уже открыт в другой вкладке".

Как это сделать?


Ответы (1 шт):

Автор решения: Solt

Стек П/О в принципе не важен. Надо решить ряд следующих задач:

Идентификация клиента.

Возможные решения:

  1. куки. Либо сервер должен посмотреть в запросе какую-нибудь куку, если её нет - передать уникальную и в следующий раз её проверять. Либо сгенерировать уникальный идентификатор на клиенте в JS, и сохранив локально, передавать его либо в виде куки, либо параметром во все запросы.
  2. Basic-авторизация. Сервер должен проверить наличие HTTP-заголовков с basic-авторизацией, если нет выдавать 401 и ждать когда клиент их передаст. На основании авторизации считать абонета уникальным. Этот вариант хуже тем, что с двух мест можно заполнить одинаково, отличий не будет.

Проверка клиента онлайн

Открытый в браузере сайт никаким образом серверу не виден. Решений два:

  1. Периодическая отправка AJAX-запросов на сервер, дабы он знал, что абонент жив. При этом сервер должен сам следить за тайм-аутом сессии и, если запросов нет, отсчитывать тайм-аут, а если есть - обнулять таймер. Плюсы - легко реализовать. Минусы - либо большой трафик, либо большой таймаут. Частичное решение - при покидании сайта можно пытаться отправить запрос с сообщением, что клиент ушёл, освобождая сессию.
  2. Websocket-сервер. Нужен отдельный вебсокет-сервер, поддерживающий постоянные соединения, с которым веб-сервер сможет обмениваться информацией. Клиент же должен из JS к нему подключиться и висеть онлайн. Плюсы - отсутствие лишнего трафика и возможность обойтись без идентификации сессии. Минусы - более сложная реализация. Желательное условие - реализация сайта в виде одностраничного приложения (SPA) для исключения переподключений к WS. Иначе во-первых при переходах может самого себя заблочить из-за задержек работы WS-сервера, либо в этот момент подключится другой клиент.
→ Ссылка