В последнее время я был бездействую, и я не имею никаких проектов, поэтому я разобрался с некоторыми общими проблемами, с которыми я столкнулся в своей ежедневной работе. Прежде всего, я думал о проблеме многопользовательских ограничений входа в систему. Позвольте мне выявить некоторые мысли по этому вопросу.
Связанные показания:
Идеальное решение Java Web Development, чтобы не дать нескольким пользователям повторного входа в систему
1. Дизайная сцена
1) пользователю не разрешается войти в несколько мест одновременно
2) Пользователь вошел в систему на A. теперь разрешено войти в систему из B, но он выпустит A (учитывая, что пользователь был B из -за некоторых обстоятельств после входа в A, но все еще хочет продолжить предыдущую работу, поэтому ему нужно войти в систему)
3) После вытягивания из B, система даст подсказку, когда A выполняет другие операции. Пользователь входит в систему в другом месте. Если пароль может быть просочился, если он не для его собственной операции, измените пароль.
2. Карта идеи
Когда каждый пользователь входит в систему, мы обычно храним информацию пользователя в сеансе, чтобы система могла легко получить базовую информацию пользователя, когда пользователь выполняет операции. Тем не менее, этот сеанс является частным и видна только текущему пользователю (если вы согласны с тем, что пользователь получит разные сеансы, что является основной причиной того, почему несколько пользователей могут войти в систему). Тогда возникает вопрос, как пользователь может узнать, находится ли он в Интернете при входе в систему? Я считаю, что вы умны, вы уже думали, что это нелегко. Разве проблема хранения онлайн -информации пользователя в общественном месте? После проверки онлайн решение совершенно другое, и это примерно следующие два типа.
1) Определите онлайн -пользователей в базе данных
2) Хранить в приложении
После многих соображений мы обнаружим, что решению 1 необходимо решить много сложных проблем (аномальный выход пользователя и статус будущего изменения, частый доступ к базе данных влияет на производительность и т. Д.), Который, очевидно, неуместен для вас, кто требует совершенства. Таким образом, мы приняли решение 2, сохранив информацию пользователя онлайн в приложение, и конкретный дизайн заключается в следующем.
1) Блок -схема входа в систему
2) Схема эксплуатации после вытискивания
3. код
1) Метод входа в систему
@Requestmapping (value = "/login", method = requestMethod.post) Общедоступная строка Пароль правильный string result = userservice.login (имя пользователя, пароль); if (result.equals ("success")) {request.getSession (). setattribut tokensystem.out.println (jwttoken); userauthenticationtoken authtoken = tokenservice.retrieveUserauthtoken (jwttoken); // token parses system.out.println (authtoken.isauthenticated ()); System.out.println ("id =" Userauthenticationtoken.getCurrentToken (). GetUseruuid ()); // Пользователь отключен и перенаправляет по сохраненной ссылке после входа в систему. Object url = request.getSession (). GetAttribute ("redirect_link"); if (url! = null) {request.getSession (). removeAttribute ("redirect_link"); return "redirect:" + url.tostring ();} return "index";} redirectattributes.addflashattribut2) Войдите в систему, чтобы определить, является ли он уже онлайн
@Service @TransactionAlPublic Class LimitElogin {private Static Logger log = logger.getLogger (sessionListener.class); Private Static Map <String> LoginUserMap = new Hashmap <> (); // Статические пользователи hore -exclate statics <String> loginouttime = new hashmap <>) LoginLimite (httpservlectrequest, string username) {user user = userservice.findbyusername (username); string sessionId = request.getSession (). getId (); для (String Key: LoginUsermap.keySet ()) {// пользователь вошел в другое место, если (keie.eavals (uster.gethegemantame). ! loginuserMap.containsValue (sessionId)) {log.info («пользователь:» + user.getUsername () + », в« + dateUtil.dateformat (new Date (), "yyyy-mm-dd HH: mm: ss") + "extud!") «Yyyy-mm-dd Hh: Mm: Ss»)); LoginUsermap.remove (user.getUsername ()); Break;}} LoginUserMap.put (user.getUsername (), sessionId); request.getSession (). getServletContext (). setatTribut LoginUserMap); request.getSession (). getServletContext (). setattribute ("loginouttime", loginouttime); return "успех";}}3) Interceptor для входа (без входа в систему, чтобы перейти на страницу входа в систему)
Общедоступный класс LoginInterceptor Extends handlerInterceptorAdapter {@OverridePublic Boolean Prehandle (httpservlectrequest, httpservlectresponse response, обработка объекта), выбрасывает исключение {httpsession session = request.getsession (); пользователь пользователя = (пользователь) session.getattribute (httpsession = request.getsession (); user user = (пользователь). null) {response.sendredirect (request.getContextPath () + "/oreth/tologin"); return false;} // суждение об ограничении многоупомянутого входа в систему и дайте подсказку BOOLEAN ISLOGIN = false; if (user! session.getservletcontext (). getattribute ("loginusermap"); string sessionId = session.getId (); for (String Key: loginUserMap.keyset ()) {// пользователь вошел в другое место в if (key.equals (user.getUserame ()) &&! True; Break;}}} if (islogin) {map <string, string> loginouttime = (map <string, string>) session.getservletcontext (). getattribute ("loginouttime"); session.setattribuit в другом месте! "); loginouttime.remove (user.getusername ()); session.getservletcontext (). setattribute (" loginusermap ", loginouttime); response.sendredirect (request.getContextPath () +"/другой/tologin "); return;} return Super.prehandle (respect, response); Posthandle (httpservletrequest -запрос, ответ httpservletresponse, обработчик объектов, модель и модель и модели и модели) {super.afterCompletion (запрос, ответ, обработчик, Ex);}}4) Когда сеанс уничтожен, очистите пары значения ключа, сохраненные в LoginUsermap
public classsessionListener реализует httpsessionListener {private Static Logger log = logger.getLogger (sessionListener.class);@overiDePublic void sessionCreated (httpsessionEvent Event) {} @OverridePublic void sessionDestroyed (httpsessionEvent Event) {httpsessessessessessessessessessessessessessessed = Event.getSessessessessessessessessessessessessessessessessed session.getid (); // Когда сеанс уничтожен, очистите пару значений ключей, сохраненную в loginusermap user user = (user) session.getattribute ("now_user"); if (user! = null) {map <string> loginusermap = (map <string, string>) Event.getSession (). getServletContext (). getAttribute ("LogInUserMap"); if (loginUserMap.get (user.getUsername ()). equals (sessionId)) {log.info ("Clean User From Application:" + user.getusername ()); loginusermap.remove (user.getusername ()); event.getsession (). getservletcontext (). setattribute ("loginusermap", loginusermap);}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}.5) web.xml
<!-Сессионные прослушивание Многопользовательские ограничения входа в систему, выберите, чтобы очистить информацию о сеансе при очистке информации пользователя, хранящейся в приложении-> <Learser> <lloader-class> com.service.limitelogin.sessionListener </stirlicer-class> </sluster>
6) Код страницы (используется для очистки информации сеанса сжимаемого пользователя. При предоставлении подсказки, в противном случае информация о приглашении будет отображаться все время)
<script type = "text/javascript"> $ (document) .ready (function () {var message = '$ {mess}'; if (сообщение! {}}); $ ('#Mess'). html (сообщение);}}); </script>7) Очистить код сеанса пользователя
/*** Многопользовательские ограничения входа в систему, Очистить информацию о сеансе (Информация о входе в систему, информация о приглашении) ** @param request*@return*/ @responsebody @requestmapping (value = "/clearusersession") public Stringsersessession (httpservletrequest request) {httpsession httpsessession = request.getSession (); // httpsession.invalidate (); httpsession.removeattribute ("now_user"); httpsession.removeattribute ("mess"); return "успех";}Работа по разработке завершена здесь
4. Результаты работы
Выше приведено метод реализации ограничений в входе в систему Java, введенные вам редактором. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!