Идея реализации Javaweb, которая может войти в систему только в одном месте одновременно (аналогично функции входа в QQ), выглядит следующим образом:
1. Какова функция этой функции?
Все об этом думают. В любом случае, всегда будет такой спрос. В наши дни не будет никакого спроса. Полем хе -хе. Иногда это может не быть требованием, и очень вероятно, что это также сделает это для безопасности. Например, для этого необходимы система экзаменов и онлайн -системы чата.
2. Процесс реализации
а Анализ проблем
В системе мы обычно связываем информацию о входе в систему с сеансом. Кажется, что начать из этого возможно найти решение. По словам, когда пользователь входит в систему, определите, входит ли пользователь. Полем Это кажется очень простым, верно? На самом деле, если вы подумаете об этом внимательно, вы найдете следующую проблему: как заставить пользователя войти в систему ранее, то есть как получить доступ ко всем введенным в систему информации о сеансе?
беременный Конкретная реализация
Как мы все знаем, кажется, нет конкретного метода для непосредственного получения всей информации сеанса в API J2EE. Но мы можем отслеживать все процессы создания и разрушения сеансов, настраивая слушателей, а также отслеживать процессы создания, удаления и замены атрибутов в сеансе.
На самом деле, нам просто нужно сделать следующее:
При сохранении информации о входе в систему пользователя в сеансе соответствующий сеанс - это процесс создания атрибута, который может записать текущий сеанс в ArrayList.
Фактически, при сохранении его в списке вы должны сначала пройти через то, существует ли информация о входе в систему пользователя, уже существует в этом списке. Если он существует, уничтожьте информацию о сеансе, представленную в этом списке, и удалите ее из списка. Если его не существует, поместите информацию сеанса в список.
Когда информация о входе в систему сеанса уничтожается, удалите сеанс из списка напрямую.
Кроме того, когда пользователь входит в систему без входа в систему и входит в систему непосредственно, это процесс замены атрибута сеанса. Также необходимо определить, существует ли новый пользователь в других сеансах, помимо текущего сеанса. Если он существует, удалите его.
Конкретный код заключается в следующем:
пакет com.wierhp; import java.util.arraylist; import java.util.collections; import java.util.list; import javax.servlet.http.httpsession; импорт javax.servlet.httpsessionattribleteenerener; import javax.servlet.httpessessionAttriTistenerEner; Import.servlet.httpessessionatsessionattristenerener; javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;public class RecordSessionListener implements HttpSessionAttributeListener,HttpSessionListener {private static List<SessionAndUser> sessions;public static String loginFlag = "loginUser";static {if (sessions == null) {sessions = Collections.synchronizedlist (new ArrayList <sessionAnduser> ());}} public void attributeadded (httpsessionbindingevent e) {httpsession session = e.getsession (); System.out.println ("--------------*start добавлен*---------------"); String attername = e.getname (); (attrname.equals (loginflag)) {user nowuser = (user) e.getvalue (); user suser = (user) session.getattribute (loginflag); // 遍历所有 sessionfor (int i = sessions.size ()-1; i> = 0; i--) {sessionanduser tems = session.get (i); (tem.getUserid (). equals (nowuser.getname ())) {tem.getSession (). Invalidate (); // автоматически вызовать удаление SessionAnduser (); Sau.SetUserid (nowuser.getName ()); sau.setsession (session); sau.setsid (session.getid ()); sessions.add (sau);}} public void attributeremed (httpsessionBindingevent e) {httpsession session = e. e.cletribetsession (); Удален*----------------------- "); string attrname = e.getName (); // 登录 if (attrname.equals (loginflag)) {user nowuser = (user) e.getvalue (); // 遍历所有 sessionfor (int i = session.size ()-1; i> = 0; i--) {sessionAnduser tem = sessions.get (i); if (tem.getUserid (). equals (nowuser.getname ())) {sessions.remove (i); break;}}}} public attributeRepled (httpsessionBindingevent e) {httpsession session = = e.getSession (); System.out.println ("-------------*заменить замену*-------------------"); String attrname = e.getName (); int dels = -1; // 登录 if (attrname.equals (loginflag)) {// user nowuser = (user) e.getvalue (); // ald valueSer теперь (User) session.getattribute (loginflag); // Пользователь в текущем сеансе // проходит All Sessionfor (int i = sessions.size ()-1; i> = 0; i--) {sessionanduser tem = sessions.get (i); if (tem.getUserid (). Equals (nowser.getname ()) {System.out.println ("remove: Invalidate 1!"); Dels = i;} else if (tem.getSid (). Equals (session.getid ())) {tem.setUserid (nowuser.getname ());}} if (dels! недействительно. Он также будет удален из сеансов}} public void sessionCreated (httpsessionEvent e) {} public void sessionDestroyed (httpsessionEvent e) {}}Формулировка в web.xml
<Learser> <sill-name> recordsession </display-name> <licaler-class> com.weirhp.recordsessionListener </sluster-class> </reallyer>
3. Возможные проблемы
Там могут быть некоторые вещи, которые вся программа не ожидала. Там могут быть некоторые ошибки, и вы должны быть осторожны при использовании в определенных проектах. Все могут сделать фотографию и надеяться дать несколько предложений. Я снова улучшил это.
4. Некоторые мысли позже
Если обе машины используют одну и ту же учетную запись для входа в систему одновременно, могут ли оба учетные записи быть успешно войти в систему? Полем (Кроме того, когда этот список сеансов очень большой, две машины могут успешно войти в систему при входе в систему, используя одну и ту же учетную запись одновременно в течение периода обхода). Очень запутан. Полем Как это следует контролировать?
(Решение: После тестирования слушатель является синглтоном в системе. Добавление ключевого слова синхронизации в его метод может обеспечить безопасность потока списка.)
Выше приведено, что Javaweb представил вам, что редактор может войти только в одном месте одновременно (аналогично функции входа в систему QQ). Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!