En este artículo, el Proyecto en Springboot utiliza el HTTPsessionListener Listener (uno de los oyentes) para contar el número de personas en línea, que es esencialmente para contar el número de sesiones.
La idea es muy simple, pero hay un detalle que no manejé, así que la depugguí por más de un día antes de hacer el error.
Primero escriba un oyente httpsessionListener. El recuento es el número de sesiones (número de personas). Cuando se crea la sesión, se activará el método creado por la sesión del oyente. Cuando se destruye la sesión, se activará el método de sessionDestrOyed del oyente. Después de calcular el número de personas en el oyente, colóquelo en el ServletContext (puede entenderse como un repositorio donde cualquier solicitud puede almacenar y obtener las propiedades dentro).
Preste atención a agregar @Weblistener al oyente, por lo que no es necesario configurarlo.
@WeBlistener public class OnlineCount implementos httpsessionListener {public int count = 0; // registra el número de sesiones // Escuchar la creación de la sesión, sincronizado anti-concurrente registro público sincronizado void session created contar ++; arg0.getSession (). } @Override public sincronizado sincronizado sessionDestroyed (httpsessionEvent arg0) {// repita la revocación de la sesión System.out.println ("【HttpsessionListener oyente】 Count-- Reduce"); contar--; arg0.getSession (). }}Luego escriba un controlador que consulte el número de sesiones. Empecé con lo siguiente, ¡lo cual está mal!
Tome el conteo de servletContext y regrese el recuento a la parte delantera.
@RequestMapping ("/Count") @ResponseBody Public String Count (httpservletRequest httpservletRequest, httpServletResponse HttpServletResponse) {Object Count = httpservletRequest.getServletContext (). return "Count:"+Count; }Esto está mal. Encontrará que la página ve que el recuento es nulo porque no se crea una sesión, y no hay un método estadístico para activar el oyente. Así que cámbielo:
@Controller public class indexController {@RequestMapping ("/Count") @ResponseBody public String Count (httpServletRequest httPservletRequest, httpServletResponse httpServletResponse) {httpsession session = httpservletRequest.getSession (); Cuente de objetos = session.getServletContext (). GetAttribute ("Count"); return "Count:"+Count; }} Httpsession Session = httpservletRequest.getSession (); Función: si el usuario no tiene una sesión, creará una sesión, y si hay una sesión, no la creará.
Parece correcto cambiarlo a esta prueba, pero hay un problema. Un navegador corresponde a una sesión. Si abre 2 navegadores, verá que el recuento es 2, lo cual es correcto. Pero si cierra un navegador y lo abre, debe ser 2 y permanecer sin cambios, pero se convierte en 3. La razón es que el método de destrucción de la sesión no se ejecuta. Cuando vuelve a abrir, el servidor no puede encontrar la sesión original del usuario y recrear una sesión. Entonces, hay 3 sesiones, pero solo hay 2 navegadores, lo que significa que solo debe haber 2 personas en línea en la simulación.
Hay dos formas de resolver este problema. Una es llamar a un método para destruir la sesión al cerrar la página web. Otra mejor manera es dejar que el servidor recuerde la sesión original, es decir, grabar el SessionID original en el navegador y enviar el SessionID la próxima vez que la abra, para que el servidor no lo recree.
El código se modifica de la siguiente manera:
@Controller public class IndexController { @RequestMapping("/count") @ResponseBody public String number(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse){ try{ //Record sessionId in the browser Cookie c = new Cookie("JSESSIONID", Urlencoder.encode (httpservletRequest.getSession (). GetId (), "utf-8")); C.SetPath ("/"); // Establezca el período de validez de cookies primero a 2 días, no se preocupe, la sesión no se guardará durante 2 días c.setMaxage (48 * 60 * 60); httpservletResponse.addcookie (c); } catch (Exception e) {E.PrintStackTrace (); } Session httpsession = httpservletRequest.getSession (); Cuente de objetos = session.getServletContext (). GetAttribute ("Count"); return "Count:"+Count; }}Resumir
Lo anterior es un análisis de casos de springboot utilizando monitores para contar a los usuarios en línea introducidos por el editor. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!