Neste artigo, o projeto em Springboot usa o ouvinte HTTPSessionListener (um dos ouvintes) para contar o número de pessoas on -line, que é essencialmente para contar o número de sessões.
A ideia é muito simples, mas há um detalhe que eu não lidei, então depurei por mais de um dia antes de fazer o bug.
Primeiro, escreva um ouvinte HTTPSessionListener. A contagem é o número de sessões (número de pessoas). Quando a sessão for criada, o método de sessionCreated do ouvinte será acionado. Quando a sessão for destruída, o método SessionDestroyed do ouvinte será acionado. Depois de calcular o número de pessoas no ouvinte, coloque -o no ServletContext (ele pode ser entendido como um repositório onde qualquer solicitação pode armazenar e obter as propriedades dentro).
Preste atenção à adição de @WebListener ao ouvinte, para que não haja necessidade de configurá -lo.
@WebListener public class OnLineCount implements HttpSessionListener { public int count=0;//Record the number of sessions// Listen to the creation of session, synchronized Anti-concurrent bug public synchronized void sessionCreated(HttpSessionEvent arg0) { System.out.println("【HttpSessionListener Listener】count++ Increase"); contagem ++; arg0.GetSession (). } @Override Public sincronizado void sessionDestroyed (httpSessionEvent arg0) {// Repestando o sistema de revogação da sessão.out.println ("【【httpSessionListener ouvinte】 contagem- redução"); contar--; arg0.GetSession (). }}Em seguida, escreva um controlador que consulte o número de sessões. Comecei com o seguinte, o que está errado!
Assista a servir de ServletContext e contagem de retorno para o front -end.
@RequestMapping ("/count") @ResponseBody Public String contagem (httpServletRequest httpServletRequest, httpServletResponse httpServletResponse) {contagem de objeto = httpsPleTrequest.getServletContext (). Retornar "contagem:"+contagem; }Isso está errado. Você descobrirá que a página vê que a contagem é nula porque nenhuma sessão é criada e não há um método estatístico para acionar o ouvinte. Então mude:
@Controller public class IndexController { @RequestMapping("/count") @ResponseBody public String count(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse){ HttpSession session = httpServletRequest.getSession(); Contagem de objetos = session.getServletContext (). GetAttribute ("contagem"); Retornar "contagem:"+contagem; }} Sessão HttpSession = httpServletRequest.getSession (); Função: se o usuário não tiver uma sessão, ele criará uma sessão e, se houver uma sessão, ele não a criará.
Parece certo alterá -lo para este teste, mas há um problema. Um navegador corresponde a uma sessão. Se você abrir 2 navegadores, verá que a contagem é 2, o que está correto. Mas se você fechar um navegador e abri -lo, ele deve ser 2 e permanecer inalterado, mas se torna 3. O motivo é que o método de destruição da sessão não é executado. Quando você reabriu, o servidor não pode encontrar a sessão original do usuário e recriar uma sessão. Portanto, existem 3 sessões, mas existem apenas 2 navegadores, o que significa que deve haver apenas 2 pessoas on -line na simulação.
Existem duas maneiras de resolver esse problema. Uma é chamar um método para destruir a sessão ao fechar a página da web. Outra maneira melhor é deixar o servidor lembrar da sessão original, ou seja, gravar o sessão original no navegador e enviar o SessionID na próxima vez que o abrir, para que o servidor não o recrie.
O código é modificado da seguinte forma:
@Controller Classe public IndexController {@RequestMapping ("/count") @ResponseBody Public String Número (httpServletRequest httpServletRequest, httpServletResponse httpservletResponse) {{Trint {/////ticessitidid no browser C = New Cookie " Urlencoder.encode (httpServletRequest.getSession (). GetId (), "utf-8")); c.setPath ("/"); // Defina o período de validade do biscoito em primeiro lugar a 2 dias, não se preocupe, a sessão não será salva por 2 dias C.setMaxage (48 * 60 * 60); httpServletResponse.addcookie (c); } catch (Exceção e) {e.printStackTrace (); } HttpSession Session = httpServletRequest.getSession (); Contagem de objetos = session.getServletContext (). GetAttribute ("contagem"); Retornar "contagem:"+contagem; }}Resumir
O exposto acima é uma análise de caso do Springboot usando monitores para contar os usuários on -line introduzidos pelo editor. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!