В текущем веб -проекте многие ситуации заключаются в том, что на этот раз одну и ту же информацию о учетной записи можно войти в разные порталы входа в систему, поэтому она не будет такой красивой.
Рекомендуемое чтение:
Внедрение ограничений в логине Java Multi-User
Сейчас есть два решения:
1. Сохраните информацию пользователя с полевым полем в флаге. Каждый раз, когда вход в систему успешно, он помечен 1, и логин помечен 0. Когда он помечен 1, он не разрешается войти в систему.
2. Сохраните информацию пользователя в системе входа в встроенную область приложения, а затем используйте слушатель сеанса для мониторинга состояния входа каждого пользователя.
Очевидно, что первый метод требует управления базой данных каждый раз, когда вы входите в систему, что добавляет некоторые ненужные накладные расходы на производительность. Более того, если компьютер внезапно отключается во время входа в систему, вы никогда не сможете войти в систему, а удобство использования относительно низко.
Но второй метод отличается, он очень работает и удобен для поддержания информации всех онлайн -пользователей.
Далее мы в основном представим конкретную реализацию второго метода:
1. В методе входа в систему для обработки входа в систему сначала запрашивайте базу данных, чтобы проверить, существует ли пользователь. Если есть, определите, была ли учетная запись входа заблокирована. Затем возьмите всю информацию о входе в систему из приложения встроенного объекта Scope, чтобы проверить, была ли входная учетная запись имени пользователя. Если он вошел в систему, это будет дружественным подсказкой. В противном случае это означает, что вы можете войти в систему и сохранить информацию о входе в систему в приложении в форме пары клавиш.
Код заключается в следующем:
// Действие должно быть добавлено к каждому методу доступа перед нулевой конфигурацией, в противном случае 404 @Action (value = "login", results = {@Result (name = "index", location = "index.jsp"),}) public string login () Throws Exception {try {user result = usererservice.login (user.getfuusernam if (result! = null) {if (result.getFustatus ()! = null && result.getFustatus () == 0) {super.setRequestattr (constant.message, «Извините, этот пользователь был заблокирован!»); вернуть "ошибку"; } Map <string, string> loginUserMap = (map <string, string>) super.getApplicationattr (constant.login_user_map); логический isexist = false; String sessionId = super.getSessionId (false); if (loginusermap == null) {loginusermap = new hashmap <string, string> (); } for (String username: loginUsermap.keyset ()) {// Судья, была ли сохранена информация пользователя, зарегистрированное в зарегистрированном входе, или вход в систему разрешена, если (! username.equals (result.getfuusername ()) || loginusermap.containsValue (sessionId) {getFuusername ()) || } isexist = true; перерыв; } if (isexist) {super.setRequestattr (constant.message, «Извините, пользователь вошел в систему!»); вернуть "ошибку"; } else {loginUserMap.put (result.getFuuserName (), sessionId); } // Вход успешно super.setsessionAttr (constant.login_user, result); Super.SetApplicationAttr (constant.login_user_map, loginusermap); logger.info (result.getfuusername () + "Вход успешно!"); // Если у Formurl есть значение в сеансе, перейдите на строку страницы OffUrl = (String) super.getSessionAttr (constant.from_url); if (fromurl! = null) {super.setsessionAttr (constant.from_url, null); Super.getResponse (). SendRieRect (OffUrl.ToString ()); вернуть ноль; } вернуть "индекс"; }} catch (Exception e) {e.printstackTrace (); logger.info ("login не удастся:"+e.getmessage ()); } super.setRequestattr ("message", "error"); вернуть "ошибку"; }2. После обработки портала входа в систему, учитывая, что сеанс заканчивается, соответствующий пользователь для входа должен также выходить из входа в систему. Мы можем написать слушатель сеанса. Когда сеанс уничтожен, мы зарегистрировали зарегистрированного пользователя, то есть удалить его из приложения. Это означает, что пользователь был в автономном режиме.
Код заключается в следующем:
пакет com.facelook.util; импортировать java.util.map; Импорт javax.servlet.http.httpsessionEvent; Import javax.servlet.http.httpsessionListener; Импорт org.apache.log4j.logger; Импорт com.facelook.entity.user; Public Class SessionListener реализует httpsessionListener {private logger logger = logger.getLogger (this.getClass ()); @Override public void sessionCreated (httpsessionEvent event) {} @Override public void sessionDestroyed (httpsessionEvent event) {// очистить пары значений ключей, сохраненные в loginUsermap, когда сеанс уничтожен пользователь пользователь = (пользователь). if (user! = null) {map <string, string> loginuserMap = (map <string, string>) event.getSession (). getServletContext (). getAttribute ("loginUserMap"); loginuserMap.remove (user.getFuuserName ()); event.getSession (). getServletContext (). SetAttribute ("LoginUsermap", LoginUsermap); }}}Конфигурация в web.xml заключается в следующем:
<!-Session Sulderer-> <Learser> <licaler-class> com.facelook.util.sessionListener </stirlicer-class> </sluster>
3. Кроме того, есть еще одна проблема. Если зарегистрированный пользователь внезапно закрывает браузер или страницу, не нажав кнопку «Выход». Затем вы можете использовать событие перед загрузкой для стрельбы, когда браузер обновляется или закрывается.
// События $ (window) .bind ('wordunload', function () {$ .ajax ({url: "$ {ctx} /system/user/user!logout.action", тип: "post", успех: function () {alert ("Вы вышли из выхода");}}););););););););););););););););););););););););););););Однако, если некоторые объективные причины, такие как компьютер, внезапно выключаются, автоматический перезапуск и т. Д., Их нельзя избежать, поэтому вы можете только дождаться сеанса сеанса на стороне сервера, прежде чем вы сможете войти снова.
Если это не модуль, который подсчитывает весь онлайн -персонал, администратор управляет входом в систему и статусом входа в систему онлайн -персонала и напрямую разрушает тех, кто зарегистрирован в пользователях с проблемами.
Далее, давайте кратко представим управление онлайн -модулями персонала:
1. Во -первых, слушатель сеанса необходим для мониторинга всех ответных ситуаций. В настоящее время каждый раз, когда можно подсчитать сессию, можно подсчитать, а затем график-1 разрушается. Кроме того, слушатель ServletContext необходим для мониторинга жизненного цикла веб -приложения, получить объект ServletContext, а затем подсчитать общее количество онлайн -персонала и хранить его;
Конкретный код заключается в следующем:
пакет com.facelook.util; импортировать java.util.map; Импорт javax.servlet.servletcontext; Импорт javax.servlet.servletContextevent; Импорт javax.servlet.servletContextLister; Импорт javax.servlet.http.httpsessionEvent; Import javax.servlet.http.httpsessionListener; Import javax.servlet.http.httpsessionListener; Импорт org.apache.log4j.logger; Импорт com.facelook.entity.user; Public Class SessionListener реализует httpsessionListener, ServletContextLister {private int count; Private ServletContext ServletContext = null; public SessionListener () {count = 0; } private logger logger = logger.getLogger (this.getClass ()); @Override public void sessionCreated (httpsessionEvent событие) {count ++; setContext (Event); logger.info ("************ Сессия http создана ... ***************** '); } @Override public void sessionDestroyed (httpsessionEvent event) {// Очистить пары значений ключа, сохраненные в loginUsermap, когда сеанс уничтожен пользователем user = (user) event.getSession (). GetAttribute ("loginUser"); if (user! = null) {map <string, string> loginuserMap = (map <string, string>) event.getSession (). getServletContext (). getAttribute ("loginUserMap"); loginuserMap.remove (user.getFuuserName ()); event.getSession (). getServletContext (). SetAttribute ("LoginUsermap", LoginUsermap); } считать--; setContext (Event); logger.info ("************ Сессия http уничтожена ... *******************"); } public void setContext (httpsessionEvent httpsessionEvent) {httpsessionEvent.getSession (). getServletContext (). setAttribute ("Online", count); } @Override public void contextDestroyed (ServletContexTevent ServletContexTexTent) {this.ServletContext = null; logger.info ("************ Контекст сервлета разрушен ... *******************"); } @Override public void contextInitialized (ServletContexTevent ServletContexTexTent) {this.ServletContext = ServletContexTexTent.getServletContext (); logger.info ("************ Контекст сервлета инициализируется ... ******************); }}2. Создайте модуль для управления пользователями онлайн -пользователей в пользователях и поддержать функцию принудительного выхода;
/ ** * logout * @return * @Throws ServletException * @Throws ioException */ public String logout () Throws ServletException, ioException {try {map <string, string> loginUsermap = (map <string>) super.getApplicationatttr (constant.login_user_map); Пользователь пользователь = (пользователь) super.getSessionAttr (constant.login_user); super.removeattribute (constant.login_user_map); loginuserMap.remove (user.getFuuserName ()); Super.SetApplicationAttr (constant.login_user_map, loginusermap); logger.info ("Вход в систему успешно!"); } catch (Exception e) {e.printstackTrace (); logger.error ("login не удастся:"+e.getMessage ()); } return Input; } / *** онлайн управление пользователями* @return* / public String loginmanager () {return Success; } / *** Выход из силы от других пользователей* @return* / public String logouthother () {try {string username = servletactuctoncontext.getRequest (). GetParameter ("userName"); Map <string, string> loginuserMap = (map <string, string>) super.getApplicationattr (constant.login_user_map); if (username! = null && loginusermap.containskey (username)) {loginusermap.remove (username); Super.SetApplicationAttr (constant.login_user_map, loginusermap); }} catch (Exception e) {e.printstackTrace (); logger.info ("насильно выход не удался:"+e.getMessage ()); } return null; }3. Загрузите список онлайн -пользователей на странице управления;
После определения соответствующего метода, затем добавьте онлайн -список к соответствующей странице управления, следующим образом:
<%@page import = "java.util.map"%> <%@page import = "java.util.map.entry"%> <%@page language = "java" pageencoding = "utf-8"%> <%@include file = "/common/taglib.jsp"%> <! doctpe html public "-// w3c/dtm.0-hht htm Transitional // en "" http://www.w3.org/tr/xhtml1/dtd/xhtml1-transition.dtd "> <html xmlns =" http://www.w3.org/1999/xhtml "> <adember> <meta h ht-equive-equive-equive-equiv content = "text/html; charset = utf-8"/> <title> добро пожаловать в Facelook </title> < %@ include file = "/common/resource.jsp" %> <script type = "text/javascript"> <!-// События $ (window) .bind ('перед загрузкой', function () {$. URL: "$ {ctx} /system/user/user!logout.action", тип: "post", успех: function () {alert ("Вы зарегистрировали"); Логирование функции (username) {if (username == "$ {sessionscope.loginuser.fuusername}") {alert ("vogout of Your Account!"); возвращаться; } долларов $ ("#count"). html (count-1); } //-> </script> </head> <body> <%@ include file = "/common/header.jsp"%> <div id = "main"> <%@ include file = "/common/lefter.jsp"%> <div> <div> <h2> login list </h2> <%map <string> map = (map <string, string>). out.println («В настоящее время есть <font id = 'count'>»+map.size ()+»</font> пользователи онлайн !!»); %> <table> <%для (inpit <string, string> m: map.entryset ()) {%> <tr id = "tr <%= m.getkey ()%>"> <td> <%= m.getkey ()%> </td> <td> <a href = "javascript: logout ('<%= m.getkey ()%>')"> esciSt <//rist <//> exit exit <//> exit exit <//> exit exit <//> exit exit </td> exit <//> resit exit <//> exit exit: <//- <%}%> </table> </div> </div> </div> <%@ include file = "/common/cooler.jsp"%> <%@ include file = "/common/message.jsp"%> </body> </html>ОК, запустите проект развертывания, затем запустите службу и введите онлайн -модуль управления пользователями. Простой эффект заключается в следующем:
Следует отметить, что текущему пользователю входа в систему не разрешается вытеснять его/ее информацию о входе в систему.
Таким образом, случаи предотвращения входа нескольких пользователей могут быть реализованы!
Приведенное выше является идеальным решением для веб -разработки Java, чтобы не дать нескольким пользователям многократно входить в систему. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!