Как я могу управлять сессиями в Java EE? - PullRequest
4 голосов
/ 13 апреля 2009

В моем приложении Java EE возникла проблема с сеансами. Различные пользователи могут войти в приложение, и указанный пользователь может видеть данные, для которых он авторизован. Он не должен быть в состоянии видеть другие пользовательские данные. Для дифференциации пользователей мы используем Client_ID. Как только пользователь входит в систему, мы выбираем этот Client_ID из базы данных и устанавливаем его в сеанс, например:

session.setAttribute("Client_ID",user.getClient_ID())

Мы получаем доступ к этому значению сеанса по всему приложению и извлекаем соответствующие данные для этого Client_ID. Это прекрасно работает, когда пользователи работают в одном браузере, но проблема в следующем:

Предположим, есть SuperAdmin, которому нужно посмотреть всех клиентов под ним. SuperAdmin регистрируется как client_1 и снова как client_2. SuperAdmin вошел в систему оба раза с использованием одного и того же браузера. Когда я обновляю браузер client_1, я вижу детали client_2, чего не должно быть.

Я думаю, что наше приложение использует один и тот же сеанс для двух разных входов в систему в одном браузере. Что бы решить эту проблему? Я должен увидеть правильные данные для конкретного клиента при обновлении страницы.

Ответы [ 3 ]

7 голосов
/ 13 апреля 2009

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

P.S .: Я думаю, что нельзя одновременно войти в систему под 2 или более пользователями в одном браузере. Ваше приложение должно обнаружить, что client_1 уже подписал его и запретить вход для других пользователей из того же браузера до выхода из системы. Например, приложения Google работают таким образом. Также было бы неплохо, если бы в SuperAdmin была возможность просматривать данные client_1 или client_2 без входа в систему. Это избавит его от запоминания десятков паролей и повысит производительность работы (время - деньги, а?).

1 голос
/ 13 апреля 2009

Решение состоит в том, чтобы использовать роли вместо нескольких входов в систему. Вы бы дали роль super_min client_1, а клиент 2 - нет. Это уменьшит необходимость входа в систему в два раза.

Но в любом случае вы должны разрешить вход только одному пользователю одновременно. Процесс входа в систему должен сделать недействительным предыдущий сеанс. Я забыл точный код в Java EE, но это что-то вроде session.invalidate().

1 голос
/ 13 апреля 2009

Если вы хотите, чтобы несколько вкладок в одном и том же экземпляре браузера видели разные вещи, вам придется переделать управление сеансом и ключевые моменты из URL.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...