Эта статья в основном представляет использование прослушивания сеансов в Java для достижения ограничений входа в систему и количества входа в систему для той же учетной записи. Конкретный код заключается в следующем:
Проблема домен:
1. Войдите в систему с той же учетной записью: если эта учетная запись уже входит в систему, вы не сможете снова войти в систему (противоположное режиму QQ).
2. Если количество зарегистрированных внедряется, ограничено, если число людей превышает или достигнуто, подсказка: система занята, попробуйте еще раз позже.
Решение: используйте слушателя HTTPSessionAttributeListener (хотя я использовал httpsessionListener одновременно, он испытывает трудности в эксплуатации)
Резерв знаний: httpsessionAttributeListener имеет три метода: attributeAdd, attributeremove и attributeReplace.
SetAttribute и RemoveAttribute сеанса запустит методы AttributeAdd и AttributerEmove. Повторные настройки одного и того же атрибута того же сеанса запустит метод атрибута.
Причина, по которой httpsessionListener трудно работать: до тех пор, пока вы получаете доступ к странице JSP, вы создадите сеанс (вы не будете создавать сеанс при доступе к HTML. На стороне сервера, например, если вы позвоните httpservlectrequest.getsession (true) в сервере, вы создадите его). JSP - это динамическая страница, и это, по сути, сервлет. My Login.jsp, очевидно, JSP. Когда я аннулирую сеанс в слушателе и возвращаюсь на страницу входа в систему, я сразу же создал еще один сеанс. Это то, о чем я не чувствую ясного, и я не вернулся домой от своих навыков.
Конкретная реализация:
Код слушателя
Общедоступный класс OnlineListener реализует httpsessionListener, httpsessionattributeListener {частный статический список <sessionAnduser> sessions; static int dels = -1; Статический логический флаг = false; static {if (sessions == null) {sessions = collections .synchronizedlist (new ArrayList <sessionAnduser> ()); }} public void sessionCreated (httpsessionEvent HSE) {System.out.println (hse.getSession () + "-" + new Date ()); System.out.println (hse.getSession () + "-" + new Date ()); } public void sessionDestroyed (httpsessionEvent HSE) {System.out.println ("----------------- SessionDestroyed () -----------"); System.out.println (hse.getSession () + "" + Новая дата (hse.getSession (). GetLastAccedTime ())); System.out.println (hse.getSession () + "" + new Date ()); } public void attributeAdded (httpsessionBindingevent e) {System.out.println ("-------------*Старт добавлен*-----------------------" + sessions.size ()); Httpsession session = e.getsession (); ActionContext ctx = actionContext.getContext (); Boolean Newone = True; String attrname = e.getName (); // Войти в IF (attrname.equals (constant.user_name)) {// Проверьте количество логинсов if (sessions.size ()> = constant.user_limit) {newone = false; ctx.put ("timeoutmsg", "serverbusy"); } String nowuser = (string) e.getValue (); // пройти все сеансы, чтобы проверить, вошли ли вы в систему. Если да, то это побуждает, что вы вошли в систему (int i = sessions.size ()-1; i> = 0; i--) {sessionanduser tem = sessions.get (i); if (tem.getusername (). equals (nowuser)) {newone = false; ctx.put ("timeoutmsg", "был включен"); // tem.getSession (). Invalidate (); // // Войдите в систему с той же учетной записью и автоматически вызовы удалить перерыв; }} // Добавить новую учетную запись в систему в список обслуживания учетной записи if (newone) {sessionAndus sau = new SessionAnduser (); sau.setusername (nowuser); sau.setsession (сессия); sau.setsid (session.getid ()); sessions.add (sau); }}} public void attributerEmoved (httpsessionbindingevent e) Throws allogalStateException {httpsession session = e.getSession (); System.out .println ("-------------*Начать удалено*-----------------------" + sessions.size ()); if (dels> -1) {if (flag) {sessions.remove (dels); flag = false; }} else {// 登录 string attrname = e.getName (); if (attrname.equals (constant.user_name)) {string nowuser = (string) e.getValue (); // Переносить все сеансы для (int i = sessions.size ()-1; i> = 0; i--) {sessionanduser tem = sessions.get (i); if (tem.getusername (). equals (nowuser)) {sessions.remove (i); перерыв; }}}}} public void attributeReded (httpsessionBindingevent e) {httpsession session = e.getSession (); System.out .println ("-------------*заменить заменить*-----------------------" + sessions.size ()); String attrname = e.getName (); dels = -1; // 登录 if (attrname.equals (constant.user_name)) {// user nowuser = (user) e.getvalue (); // out value string nowuser = (string) session.getattribute (constant.user_name); // 当前 Session 中的 user // traverse All Sessions for (int i = sessions.size ()-1; sessions.get (i); if (tem.getUsername (). equals (nowuser) &&! tem.getSid (). equals (session.getid ())) {System.out.println ("remove: Invalidate 1!"); dels = i; flag = true; } else if (tem.getSid (). equals (session.getid ())) {tem.setusername (nowuser); }} if (dels! = -1) {sessions.get (dels) .getSession (). Invalidate (); // Метод удаления автоматически вызывается при сбое. Он также будет удален из сеансов}}}} Основная идея кода состоит в том, чтобы определить статический список <sessionAnduser> для хранения сеанса и имени учетной записи.
Код, чтобы получить возвратное значение слушателя и обработать его в зарегистрированном действии
session.setattribute (constant.user_name, operator.getusername ()); ActionContext ctx = actionContext.getContext (); if ("serverbusy" .equals (ctx.get ("timeoutmsg"))) {ctx.put ("timeoutmsg", "Сервер занят, попробуйте еще раз позже"); вернуть "прыжок"; } if ("Begeded" .equals (ctx.get ("timeoutmsg"))) {ctx.put ("timeoutmsg", "эта учетная запись регистрируется в другом месте"); вернуть "прыжок"; } Информационный код
<%@taglib prefix = "s" uri = " /struts-tags"%> <s: значение свойства = "#attr.timeoutmsg" />
Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!