2011-05-09 1 views
0

У нас есть веб-приложение, которое использует Struts 2, Spring и Hibernate.Недействительный сеанс пользователя в одном браузере при входе пользователя в другой браузер?

В настоящее время пользователь, использующий два разных браузера (IE и FF), может одновременно войти в одну учетную запись.

Теперь, когда вы нажимаете кнопку входа в систему, нам необходимо аннулировать все остальные логины для этой учетной записи.

например. Пользователь входит в учетную запись в Firefox. Тот же пользователь входит в одну учетную запись в IE. В этом случае, когда он входит в IE, его сеанс в firefox должен быть недействительным.

Есть ли способ, которым мы можем это сделать?

Пожалуйста, помогите

ответ

1

Ключ «та же учетная запись». Я никогда не сделаю этого, если пользователь войдет в разные учетные записи из нескольких браузеров.

Когда пользователь входит в систему, возьмите случайное значение для переменной сеанса, связанной с учетной записью. Если значение сеанса отличается от этого значения, то это не действительный сеанс.

2

Если следить за того, что пользователь не войти в то, что сессия, то да, я думаю, что это может быть сделано. У вас уже есть личность, теперь при каждом входе вы отправляете свой список всех зарегистрированных пользователей и их сеансов (хранящихся в любой структуре данных, которая вам нравится: т.е. статическая карта хэша (я знаю, что статика плохая :-), но они также иногда полезны) и аннулируют его предыдущую сессию.

Вы сидите на сервере, у вас есть полномочия для организации сеансов по своему усмотрению.

+0

Я бы сказал, что вы можете улучшить эти два пути. Чтобы избежать статичности, используйте пружину или гусь, чтобы ввести одноэлемент. Во-вторых, если у вас есть кластер или намеревается перейти на один в ближайшей перспективе, вы должны хранить эту информацию за пределами одного сервера, так как нет гарантии, что второй вход на тот же сервер. Memcached, вероятно, будет работать нормально, хотя я мог бы также увидеть нечто более стойкое, как DB, которое также полезно. Вам понадобится механизм обновления ВСЕХ серверов в кластере, чтобы сообщить им о недействительности дополнительного сеанса. Для этого вам может понадобиться какой-то паб/sub. – rfeak

+0

Да, я согласен, что это было упрощенное представление, не учитывающее кластеризацию. Но, как вы предположили, memcached или аналогичный метод должен работать нормально и заботиться о кластерах. Сессия будет реплицироваться по дизайну (иначе кластеризация не будет работать), поэтому необходимо связать идентификатор пользователя с идентификатором сеанса. –

1

Согласен с Tomasz Stanczak .. Но не забудьте проверить IP-адрес, по которому учетная запись выходит во второй раз. Кроме того, есть высокая вероятность выхода из первоначального пользователя для нарушителя для входа в систему :-)

На мой взгляд, я хотел бы попросить пользователя выйти из другого места (например, IE), прежде чем он войдет в систему здесь (скажем, FF). Взгляните на функцию, которую имеет gmail (в нижней части страницы - активность учетной записи), вы можете вывести все остальные сеансы из одного места.

+0

Вы предполагаете, что злоумышленник зашел во второй. –

+0

Мы не можем на самом деле предположить это. Учетная запись уже ушла, если злоумышленник входит в систему первым .. :-) Вам нужно добавить интеллект! Это сложно, gmail имеет одну из сложнейшей системы аутентификации, которую я когда-либо видел. –

Смежные вопросы