Este artigo apresenta principalmente o uso da sessão de escuta em Java para obter restrições de login e número de logins para a mesma conta. O código específico é o seguinte:
Domínio do problema:
1. Faça login com a mesma conta: se esta conta já estiver conectada, você não poderá fazer login novamente (o oposto do modo QQ).
2. Se o número de logado for limitado, se o número de pessoas exceder ou tiver sido alcançado, o aviso é: o sistema está ocupado, tente novamente mais tarde.
Solução: Use o ouvinte httpSessionAttributelistener (embora eu tenha usado o HTTPSessionListener ao mesmo tempo, parece difícil de operar)
Reserva de conhecimento: HttpSessionAttributElistener possui três métodos: atributeadd, atributeremove e atributereplace.
O SetAttribute e o Removeattribute da sessão acionarão os métodos AttributeAdd e AttriboreRemove. Configurações repetidas do mesmo atributo da mesma sessão acionarão o método AttributerElplace.
A razão pela qual o HTTPSessionListener é difícil de operar: desde que você acesse a página JSP, você criará uma sessão (você não criará uma sessão ao acessar o HTML. No lado do servidor, por exemplo, se você ligar para HttPervletRequest.getSession (true) no servlet, você o criará). O JSP é uma página dinâmica e é essencialmente um servlet. Meu login.jsp é obviamente um JSP. Quando invalidar uma sessão no ouvinte e retorno à página de login, criei imediatamente outra sessão. Isso é algo que eu não me sinto claro e não cheguei em casa das minhas habilidades.
Implementação específica:
Código do ouvinte
classe pública onlineListener implementa httpsessionListener, httpSessionAttributelistener {Private Static List <SessionAndUser> sessões; estático int dels = -1; bandeira booleana estática = false; static {if (Sessions == null) {Sessions = Coleções .SynchronizedList (novo 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 () + "" + nova data (hse.getSession (). GetLastAccedTime ())); System.out.println (hse.getSession () + "" + new Date ()); } public void atribuiDedded (httpSessionBindingEvent e) {System.out.println ("-----------*Iniciar adicionado*-----------------------" + sessions.size ()); Sessão HttpSession = E.GetSession (); ActionContext ctx = actionContext.getContext (); booleano newone = true; String attName = e.getName (); // Faça login if (attName.equals (constant.user_name)) {// verifique o número de logins if (sessions.size ()> = constant.user_limit) {newone = false; ctx.put ("timeoutmsg", "serverbusy"); } String nowUser = (string) e.getValue (); // atravessa todas as sessões para verificar se você fez login. Se sim, ele solicita que você efetuou login (int i = sessions.size ()-1; i> = 0; i-) {sessionAndUser tem = sessões.get (i); if (tem.getUserName (). Equals (NowUser)) {newone = false; ctx.put ("timeoutmsg", "be foilogado"); // tem.getSession (). invalidate (); // // efetuar login com a mesma conta e ligue automaticamente para remover quebra; }} // Adicione a nova conta de login à lista de manutenção da conta se (newone) {sessionAndUser sau = new SessionAndUser (); sau.setUsername (agora); Sau.SetSession (Sessão); sau.setsid (session.getId ()); Sessions.add (SAU); }}} public void atributeRemoved (httpSessionBindingEvent e) lança ilegalStateException {httpSession Session = e.getSession (); System.out .println ("-----------*comece a remover*-----------------------" + sessions.size ()); if (dels> -1) {if (flag) {sessions.remove (dels); bandeira = false; }} else {// 登录 string attName = e.getName (); if (attName.equals (constant.user_name)) {string nowUser = (string) e.getValue (); // atravessa todas as sessões para (int i = sessions.size ()-1; i> = 0; i-) {sessionAndUser tem = sessions.get (i); if (tem.getUserName (). Equals (NowUser)) {Sessions.Remove (i); quebrar; }}}}} public void atributeRePlaced (httpSessionBindingEvent e) {httpSession session = e.getSession (); System.out .println ("-------------*Comece a substituir*-----------------------" + sessions.size ()); String attName = e.getName (); dels = -1; // 登录 if (attName.equals (constant.user_name)) {// user nowUser = (user) e.getValue (); // Valor antigo string nowUser = (string) session.getAttribute (constant.User_Name); tem = sessões.get (i); if (tem.getUserName (). Equals (NowUser) &&! Tem.getsid (). Equals (session.getId ())) {System.out.println ("Remover: invalidar 1!"); dels = i; bandeira = true; } else if (tem.getsid (). Equals (session.getId ())) {tem.setUserName (agoraUser); }} if (dels! = -1) {sessions.get (dels) .getSession (). invalidate (); // O método de remoção é chamado automaticamente quando falha. Também será removido das sessões}}}} A idéia principal do código é definir uma lista estática <SessionAndUser> para armazenar o nome da sessão e da conta.
O código para obter o valor de retorno do ouvinte e processá-lo na ação conectada
session.setAttribute (constant.user_name, operator.getUserName ()); ActionContext ctx = actionContext.getContext (); if ("serverbusy" .equals (ctx.get ("timeoutmsg"))) {ctx.put ("timeoutmsg", "o servidor está ocupado, tente novamente mais tarde"); retornar "salto"; } if ("BeenLoged" .Equals (ctx.get ("timeoutmsg"))) {ctx.put ("timeoutmsg", "esta conta está registrada em outros lugares"); retornar "salto"; } Página Captura de Código de Informações Prompt
<%@taglib prefix = "s" URI = " /struts-tags"%> <s: Property value = "#attr.Timeoutmsg" />
Obrigado pela leitura, espero que isso possa ajudá -lo. Obrigado pelo seu apoio a este site!