Este artículo presenta principalmente el uso de la escucha de sesión en Java para lograr restricciones de inicio de sesión y el número de inicios de sesión para la misma cuenta. El código específico es el siguiente:
Dominio del problema:
1. Inicie sesión con la misma cuenta: si esta cuenta ya está registrada, no puede iniciar sesión nuevamente (lo opuesto al modo QQ).
2. Si el número de registrado es limitado, si el número de personas excede o ha sido alcanzado, el aviso es: el sistema está ocupado, intente nuevamente más tarde.
Solución: use el oyente HTTPSESSIONTTributEnstener (aunque utilicé el HttpsessionListener al mismo tiempo, se siente difícil de operar)
Reserva de conocimiento: httpsessionAtTributEnstener tiene tres métodos: Attributeadd, AttributeReMove y AttribuTerePlace.
El setAttribute y el retributo de la sesión activarán los métodos AttributeDD y AttributeReMove. La configuración repetida del mismo atributo de la misma sesión activará el método AttributeReplace.
La razón por la cual httpsessionListener es difícil de operar: siempre que acceda a la página JSP, creará una sesión (no creará una sesión al acceder al HTML. En el lado del servidor, por ejemplo, si llama a httpservletrequest.getSession (verdadero) en el servlet, lo creará). JSP es una página dinámica y es esencialmente un servlet. Mi login.jsp es obviamente un JSP. Cuando invalido una sesión en el oyente y regreso a la página de inicio de sesión, inmediatamente creé otra sesión. Esto es algo de lo que no me siento claro, y no he llegado a casa de mis habilidades.
Implementación específica:
Código del oyente
La clase pública OnLineListener implementa httpsessionListener, httpsessionAttributeListener {sesions private static list <essessandUser>; static int dels = -1; bandera booleana estática = falso; static {if (sessions == null) {sessions = colecciones .synchronizedList (new ArrayList <SessionandUser> ()); }} public void sessionCreated (httpsessionEvent hse) {system.out.println (hse.getSession () + "-" + nueva fecha ()); System.out.println (hse.getSession () + "-" + nueva fecha ()); } public void sessionDestroyed (httpSessionEvent HSE) {System.out.println ("------------- SessionDestroyed () -----------"); System.out.println (hse.getSession () + "" + nueva fecha (hse.getSession (). GetLastacceSttime ())); System.out.println (hse.getSession () + "" + new Date ()); } public void attributeAdDed (httpsessionBindingEvent e) {System.out.println ("-------------*Inicio agregado*---------------------------" + sessions.size ()); Httpsession Session = E.getSession (); ActionContext ctx = ActionContext.getContext (); boolean newone = verdadero; Cadena attrname = e.getName (); // Iniciar sesión if (attrname.equals (constant.user_name)) {// verifique el número de inicios de sesión if (sessions.size ()> = constant.user_limit) {newone = false; ctx.put ("timeOutmsg", "ServerBusy"); } String NowUser = (String) e.getValue (); // atraviesa todas las sesiones para verificar si ha iniciado sesión. Si es así, solicita que haya iniciado sesión para (int i = sessions.size ()-1; i> = 0; i--) {sessionanduser tem = sessions.get (i); if (tem.getUsername (). Equals (NowUser)) {newoNe = false; ctx.put ("timeOutmsg", "BeSloged"); // tem.getSession (). Invalidate (); // // Inicie sesión con la misma cuenta y llame automáticamente eliminar el descanso; }} // Agregue la nueva cuenta de inicio de sesión a la lista de mantenimiento de la cuenta if (newone) {sessionAndUser sau = new SessionAndUser (); Sau.SetUsername (Nowuser); Sau.setsession (sesión); sau.setsid (session.getId ()); sesiones.add (SAU); }}} public void atributereMoved (httpsessionbindingEvent e) arroja ilegalstateException {httpsession session = e.getSession (); System.out .println ("-------------*Comienza eliminado*-----------------------" + sessions.size ()); if (dels> -1) {if (flag) {sessions.remove (dels); bandera = falso; }} else {// 登录 cadena attrname = e.getName (); if (attrname.equals (constant.user_name)) {string nowuser = (string) e.getValue (); // atraviesa todas las sesiones para (int i = sessions.size ()-1; i> = 0; i--) {sessionanduser tem = sessions.get (i); if (tem.getUsername (). Equals (NowUser)) {sessions.remove (i); romper; }}}}} public void AttributeRePlaced (httpsessionBindEndevent e) {httpsession session = e.getSession (); System.out .println ("-------------*Iniciar reemplazo*-----------------------" + sessions.size ()); Cadena attrname = e.getName (); dels = -1; // 登录 if (attrname.equals (constant.user_name)) {// user NowUser = (user) e.getValue (); // Value antiguo String NowUser = (String) session.getattribute (constant.user_name); // 当前 Session 中的 User // Traverse todas las sesiones para (int i = sessions.size ()-1; i> 当前 中的 中的 中的 中的 中的 traver SessionAndUser tem = sessions.get (i); if (tem.getUsername (). Equals (NowUser) &&! Tem.getSid (). Equals (session.getId ())) {System.out.println ("eliminar: invalidar 1!"); dels = i; bandera = verdadero; } else if (tem.getSid (). Equals (session.getId ())) {tem.setUsername (NowUser); }} if (dels! = -1) {sessions.get (dels) .getSession (). Invalidate (); // El método de eliminación se llama automáticamente cuando falla. También se eliminará de las sesiones}}}} La idea principal del código es definir una lista estática <SessionAndUser> para almacenar la sesión y el nombre de la cuenta.
El código para obtener el valor de retorno del oyente y procesarlo en la acción iniciada
session.SetAttribute (constant.user_name, operator.getUsername ()); ActionContext ctx = ActionContext.getContext (); if ("serverBusy" .equals (ctx.get ("timeoutmsg"))) {ctx.put ("timeOutmsg", "El servidor está ocupado, intente nuevamente más tarde"); regresar "saltar"; } if ("beenLoged" .equals (ctx.get ("timeoutmsg"))) {ctx.put ("timeOutmsg", "Esta cuenta se registra en otro lugar"); regresar "saltar"; } Código de información de solicitud de captura de página
<%@taglib prefix = "s" uri = " /struts-tags"%> <s: propiedad valor = "#attr.timeoutmsg" />
Gracias por leer, espero que pueda ayudarte. ¡Gracias por su apoyo para este sitio!