A idéia de implementação de Javaweb que só pode fazer login em um só lugar ao mesmo tempo (semelhante à função de login QQ) é a seguinte:
1. Qual é a função desta função?
Todo mundo pensa sobre isso. De qualquer forma, sempre haverá uma demanda. Não haverá demanda atualmente. . hehe. Às vezes, pode não ser um requisito, e é muito provável que também o faça por segurança. Por exemplo, o sistema de exame e o sistema de bate -papo on -line são necessários para fazer isso.
2. Processo de implementação
um. Análise de problemas
No sistema, geralmente ligamos as informações de login à sessão. Parece que a partir disso é possível encontrar uma solução. Para ser franco, quando o usuário efetuar login, determine se o usuário está conectado. Se ele efetuar login, estará bem limpar a sessão anterior. . Parece muito simples, certo? De fato, se você pensar com cuidado, encontrará o seguinte problema: como obter o usuário já fez login antes, ou seja, como acessar todas as informações de sessão conectadas?
b. Implementação específica
Como todos sabemos, parece não haver um método específico para obter diretamente todas as informações da sessão na API J2EE. Mas podemos monitorar todos os processos de criação e destruição da sessão configurando os ouvintes, além de monitorar os processos de criação, exclusão e substituição de atributos na sessão.
De fato, só precisamos fazer o seguinte:
Ao salvar as informações de login do usuário na sessão, a sessão correspondente é o processo AttributeAdedded de criação de um atributo, que pode gravar a sessão atual em um ArrayList.
De fato, ao salvá -lo na lista, você deve primeiro atravessar se existem informações de login do usuário já existem nesta lista. Se existir, destrua as informações da sessão presente nesta lista e remova -as da lista. Se não existir, coloque as informações da sessão na lista.
Quando as informações de login da sessão forem destruídas, remova diretamente a sessão da lista.
Além disso, quando o usuário efetua login sem fazer login e registrar diretamente, este é um processo de substituição do atributo da sessão. Também é necessário determinar se o novo usuário já existe em outras sessões além da sessão atual. Se existir, exclua -o.
O código específico é o seguinte:
package com.weirhp;import java.util.ArrayList;import java.util.Collections;import java.util.List;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpSessionAttributeListener;import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.httpSessionEvent; importar javax.servlet.http.httpSessionListener; public class RecordingListener implementa httpsionAtTributElistener, httpsessionListener {private static <listuSer> sessions; public stratflflflfLl. null) {sessions = collection.synchronizedList (novo ArrayList <SessionAndUser> ());}} public void atribuiDedded (httpSessionBindingEvent e) {httpSession session = e.getSession (); System.out.println ("-------------*START*-登录 if (attName.equals (loginflag)) {user nowUser = (user) e.getValue (); usuário suser = (user) session.getAttribute (loginflag); // 遍历所有 sessãofor (int i = sessions.size ()-1; i> = 0; i-) {session tEM = sesss. (tem.getUserId (). Equals (nowUser.getName ())) {tem.getSession (). Invalidate (); // Ligue automaticamente a remoção de remoção;}} sessionAndUser Sau = novo SessionAndUser (); sau.setUserID (agoraUser.getName ()); sau.setsessionSession (sessão); sau.setsid (session.getId ()); sessions.add (sau);}} public void attributeremoved (httpSessionbindingEvent E) {httpsess e.getSession (); System.out.println ("-------------*comece a remover*-----------------------"); string attName = e.getName (); // 登录 if (attName.equals (Loginflag)) {user nowUser = (user) e.getValue (); // 遍历所有 遍历所有 (int i. i> = 0; i--) {sessionAndUser tem = sessions.get (i); if (tem.getUserID (). igual (agorauser.getName ())) {sessions.remove (i); quebra;}}}} public void attributereplaced (httpsionbindingingEvent E) {httpsp e.getSession (); System.out.println ("-------------*Comece a substituir*-----------------------"); string attName = e.getName (); int dels = -1; // 登录 if (attName.equals (Loginflag)) {// userUser = () e.getvalue (); (Usuário) session.getAttribute (loginflag); // o usuário na sessão atual // atravessa todas as sessões (int i = sessions.size ()-1; i> = 0; i-) {sessionandUser tem = sessões.get (i); se (tem.getUserId (). Equals (agoraUser.getName ()) &&! Tem.getSid (). Equals (session.getId ())) {System.out.println ("Remover: invalidar 1!"); dels = i;} else if (tem.getsid (). Equals (session.getId ())) {tem.setUserID (agorauser.getName ());}} if (dels! =-1) {sessions.get (dels) .getSession (). Invalidate (); // O método de remoção é chamado automaticamente quando o invalido. Ele também será removido das sessões}}} public void sessionCreated (httpSessionEvent e) {} public void sessionDestroyed (httpSessionEvent e) {}}Formulação em web.xml
<i ouvinte> <libe-name> registros </lisplay-name> <listener-class> com.weirhp.recordsessionListener </lister-class> </lister>
3. Possíveis problemas
Pode haver algumas coisas que todo o programa não esperava. Pode haver alguns bugs e você precisa ser cauteloso quando usado em projetos específicos. Todos são convidados a fazer uma foto e esperar dar algumas sugestões. Vou melhorá -lo novamente.
4. Alguns pensamentos mais tarde
Se as duas máquinas usarem a mesma conta para fazer login no sistema ao mesmo tempo, as duas contas podem ser registradas com sucesso? . (Além disso, quando esta lista de sessões é muito grande, duas máquinas podem fazer login com sucesso ao fazer login no sistema, usando a mesma conta ao mesmo tempo durante o período de travessia). Muito emaranhado. . Como deve ser controlado?
(Solução: Após o teste, o ouvinte é um singleton no sistema. Adicionar a palavra -chave sincronizada ao seu método pode garantir a segurança do thread da lista.)
O acima é o Javaweb apresentado a você que o editor pode fazer login apenas em um local ao mesmo tempo (semelhante à função de login QQ). 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!